【问题标题】:How do you unit test RazorViewEngineOptions in ASP.NET Core MVC?如何在 ASP.NET Core MVC 中对 RazorViewEngineOptions 进行单元测试?
【发布时间】:2019-03-29 13:43:14
【问题描述】:

在从ConfigureServices 调用的扩展方法中,我将EmbeddedFileProvider 的实例添加到RazorViewEngineOptions。我想测试它是否被添加,但我找不到如何获取 RazorViewEngineOptions 实例。

这在应用程序运行时有效:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
                  .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    services.AddMyServices(Configuration);
}
public static IServiceCollection AddMyServices(this IServiceCollection services, IConfiguration configuration)
{
    services.Configure<RazorViewEngineOptions>(options => 
    {
        options.FileProviders.Add(new EmbeddedFileProvider(typeof(MyClass).Assembly, "My.Namespace"));
    });

    return services;
}

但是我该如何测试呢?此处抛出NullReferenceException

[Fact]
public void MyTest()
{
    var services = new ServiceCollection();
    var serviceProvider = services.BuildServiceProvider();

    MyServicesBuilder.AddMyServices(services, new Mock<IConfiguration>().Object);
    var razorOptions = serviceProvider.GetService<IOptions<RazorViewEngineOptions>>();

    Assert.Equal(1, razorOptions.Value.FileProviders.Where(x => x.GetType() == typeof(EmbeddedFileProvider)).Count());
}

我已尝试添加services.AddMvc()services.AddSingleton&lt;RazorViewEngineOptions&gt;()

我也尝试过调用services.GetRequiredService&lt;RazorViewEngineOptions&gt;(),但会抛出System.InvalidOperationException : No service for type 'Microsoft.Extensions.Options.IOptions'1[Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions

我也尝试过询问RazorViewEngineOptions 而不是IOptions&lt;RazorViewEngineOptions&gt;

【问题讨论】:

  • 在构建提供者后添加到服务集合中的任何内容都不会为提供者所知。

标签: c# unit-testing asp.net-core .net-core


【解决方案1】:

在构建提供者之后添加到服务集合中的任何内容都不会为提供者所知。

将所需的一切添加到服务集合中,然后才构建提供程序来执行您的断言

例如

[Fact]
public void MyTest() {
    //Arrange
    var services = new ServiceCollection();
    services.AddOptions();

    IConfiguration config = new ConfigurationBuilder()
        // Call additional providers here as needed.
        //...
        .Build();

    //Act
    MyServicesBuilder.AddMyServices(services, config);
    //OR
    //services.AddMyServices(config);

    //Assert
    var serviceProvider = services.BuildServiceProvider();
    var razorOptions = serviceProvider.GetService<IOptions<RazorViewEngineOptions>>();

    Assert.NotNull(razorOptions);
    Assert.Equal(1, razorOptions.Value.FileProviders.Where(x => x.GetType() == typeof(EmbeddedFileProvider)).Count());
}

【讨论】:

  • @sussexrick 很高兴为您提供帮助。
猜你喜欢
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
相关资源
最近更新 更多