web-dev-qa-db-ja.com

単体テストでIHostingEnvironmentを設定する

現在、プロジェクトを.NET Core RC1から新しいRTM 1.0バージョンにアップグレードしています。RC1では、IApplicationEnvironmentIHostingEnvironmentに置き換えられましたバージョン1.0

RC1ではこれを行うことができました

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

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

誰かがv1.0でこれを達成する方法を知っていますか?

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

    public MyClass()
    {
        HostingEnvironment = ???????????;
    }
}
12
Bill Posters

必要に応じてモックフレームワークを使用して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
}
13
Nkosi

一般に、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);
4
Set