Как вы тестируете модуль RazorViewEngineOptions в ASP.NET Core MVC? - PullRequest
2 голосов
/ 29 марта 2019

В методе расширения, вызываемом из 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;
}

Но как мне это проверить? A 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<RazorViewEngineOptions>().

Я также пытался позвонить services.GetRequiredService<RazorViewEngineOptions>(), но это бросает System.InvalidOperationException : No service for type 'Microsoft.Extensions.Options.IOptions'1[Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions

Я также пытался попросить RazorViewEngineOptions вместо IOptions<RazorViewEngineOptions>.

1 Ответ

0 голосов
/ 29 марта 2019

Все, что будет добавлено в коллекцию услуг после того, как провайдер уже создан, не будет известно провайдеру.

Добавлено все необходимое для сбора сервисов и только после этого создайте провайдера для выполнения ваших утверждений

Например

[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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...