与Ioptions和KeyVault的集成测试

发布于 2025-01-21 13:46:53 字数 1383 浏览 2 评论 0原文

我正在尝试为我在代码库中拥有的广告服务编写集成测试,但是我要测试的服务要求将IOPTIONS传递给构造函数。更糟糕的是,我们正在为我们的配置使用Azure密钥库。

这是我到目前为止的测试:

[Fact]
public void Test_GetAccessToken_GetsAccessToken()
{

    //Arrange
    var azureAdOptions = Options.Create(new AzureAd());
    
    var aadService = new MyPortal.Services.Implementations.AadService(azureAdOptions);

    //Act
    var accessToken = aadService.GetAccessToken();

    //Assert
    Assert.NotEmpty(accessToken);
}

目前由于Azuread对象的属性为无效,因此目前失败了。

我的问题是,鉴于我正在测试中,并且所有这些东西都发生在启动cos.cs& program.cs文件*

这是我的program.cs文件,在其中配置了keyVault。

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((context,config) =>
        {
            var settings = config.Build();
#if (!DEBUG)
            var keyVaultName = settings["KeyVaultName"];
            if (!string.IsNullOrEmpty(keyVaultName))
            {
                config.AddAzureKeyVault(keyVaultName);
            }
#endif
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });
}

I'm trying to write an integration test for an AD Service I have in my codebase, however the service I'm testing requires IOptions to be passed in to the constructor. To make matters worse we are using azure key vault for our config.

Here is my test so far:

[Fact]
public void Test_GetAccessToken_GetsAccessToken()
{

    //Arrange
    var azureAdOptions = Options.Create(new AzureAd());
    
    var aadService = new MyPortal.Services.Implementations.AadService(azureAdOptions);

    //Act
    var accessToken = aadService.GetAccessToken();

    //Assert
    Assert.NotEmpty(accessToken);
}

This currently fails as the AzureAd object's properties are null.

my question is, how do I populate that object from Key Vault, given I'm in a test and all that stuff happens in the Startup.cs &
Program.cs files
*

This is my Program.cs file, where KeyVault is configured.

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((context,config) =>
        {
            var settings = config.Build();
#if (!DEBUG)
            var keyVaultName = settings["KeyVaultName"];
            if (!string.IsNullOrEmpty(keyVaultName))
            {
                config.AddAzureKeyVault(keyVaultName);
            }
#endif
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清泪尽 2025-01-28 13:46:53

如果您将其作为集成测试,则可以尝试使用Web应用程序工厂。

    var factory = new WebApplicationFactory<Program>();
    var client = factory.CreateClient();
    var response = await client.SendAsync(SomeHttpRequestMessage);

这应该加载您的整个程序,包括使用实际依赖项的启动。

此nuget软件包称为mvc.testing,您可以找到有关它的更多信息此处

You could try to use a Web Application Factory if you're doing this as an integration test.

    var factory = new WebApplicationFactory<Program>();
    var client = factory.CreateClient();
    var response = await client.SendAsync(SomeHttpRequestMessage);

This should load up your entire program including startup using the actual dependencies.

This nuget package is called mvc.testing and you can find some more information on it here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文