Установите IHostingEnvironment в модульном тесте

В настоящее время я обновляю проект с .NET Core RC1 до новой версии RTM 1.0. В RC1 был IApplicationEnvironment, который был заменен на IHostingEnvironment в версии 1.0.

В RC1 я мог бы сделать это

public class MyClass
{
    protected static IApplicationEnvironment ApplicationEnvironment { get;private set; }

    public MyClass()
    {
        ApplicationEnvironment = PlatformServices.Default.Application;
    }
}

Кто-нибудь знает, как добиться этого в версии 1.0?

public class MyClass
{
    protected static IHostingEnvironment HostingEnvironment { get;private set; }

    public MyClass()
    {
        HostingEnvironment = ???????????;
    }
}

person Bill Posters    schedule 01.07.2016    source источник
comment
Вы можете просто издеваться над ним в модульном тесте, реализовав интерфейс.   -  person Henk Mollema    schedule 01.07.2016


Ответы (3)


Вы можете издеваться над IHostEnvironment, используя фиктивную структуру, если это необходимо, или создать поддельную версию, реализовав интерфейс.

Проведите такой класс...

public class MyClass {
    protected IHostingEnvironment HostingEnvironment { get;private set; }

    public MyClass(IHostingEnvironment host) {
        HostingEnvironment = host;
    }
}

Вы можете настроить пример модульного теста, используя Moq...

public void TestMyClass() {
    //Arrange
    var mockEnvironment = new Mock<IHostingEnvironment>();
    //...Setup the mock as needed
    mockEnvironment
        .Setup(m => m.EnvironmentName)
        .Returns("Hosting:UnitTestEnvironment");
    //...other setup for mocked IHostingEnvironment...

    //create your SUT and pass dependencies
    var sut = new MyClass(mockEnvironment.Object);

    //Act
    //...call you SUT

    //Assert
    //...assert expectations
}
person Nkosi    schedule 12.07.2016
comment
Таким образом, вы не можете настроить метод расширения, например IsDevelopment(); - person user1785960; 10.04.2020
comment
@user1785960 user1785960 Зачем вам его настраивать? Если вы настроите EnvironmentName фиктивного объекта на Development, тогда метод расширения «IsDevelopment» вернет «true». По крайней мере, в моем случае это все, что мне нужно. - person Razor23 Donetsk; 23.06.2020

Используя Microsoft.Extensions.Hosting (один из пакетов, включенных в ASP.NET Core), вы можете использовать:

IHostEnvironment env = 
    new HostingEnvironment { EnvironmentName = Environments.Development };
person Shimmy Weitzhandler    schedule 17.07.2020

В общем, поскольку IHostingEnvironment — это всего лишь интерфейс, вы можете просто издеваться над ним, чтобы вернуть все, что хотите.

Если вы используете TestServer в своих тестах, лучший способ имитировать — использовать метод WebHostBuilder.Configure. Что-то вроде этого:

var testHostingEnvironment = new MockHostingEnvironment(); 
var builder = new WebHostBuilder()
            .Configure(app => { })
            .ConfigureServices(services =>
            {
                services.TryAddSingleton<IHostingEnvironment>(testHostingEnvironment);
            });
var server = new TestServer(builder);
person Set    schedule 01.07.2016
comment
Я не хочу использовать класс TestServer. Я считаю, что это больше для интеграционного тестирования. Мне не нужно запускать полный экземпляр приложения. Я просто хочу протестировать определенный класс. У меня есть базовый класс Test, который использовал ApplicationEnvironment в RC1, но я не могу легко заменить его в 1.0. - person Bill Posters; 11.07.2016
comment
Так почему тебе не нравится просто издеваться над этим? HostingEnvironment = ‹ макет реализации IHostingEnvironment› - person Set; 11.07.2016