如何在自托管和自身主机上运行XUnit测试生产webapi服务?

时间:2013-05-22 14:28:45

标签: testing asp.net-web-api xunit fixture self-hosting

我想为我的ASP.NET WebApi服务编写测试,并针对自托管服务和实时Web托管服务运行它。我想这可以用测试夹具完成,但我不知道如何设置它。有没有人知道使用可配置测试夹具的示例,以便您可以将参数传递给Xunit以选择自托管夹具或Web托管夹具?

2 个答案:

答案 0 :(得分:1)

以下是最新xUnit 2.0 beta的工作原理。

创建一个灯具:

public class SelfHostFixture : IDisposable {
    public static string HostBaseAddress { get; private set; }
    HttpSelfHostServer server;
    HttpSelfHostConfiguration config;

    static SelfHostFixture() {
        HostBaseAddress = ConfigurationManager.AppSettings["HostBaseAddress"]; // HttpClient in your tests will need to use same base address
        if (!HostBaseAddress.EndsWith("/"))
            HostBaseAddress += "/";
    }

    public SelfHostFixture() {
        if (/*your condition to check if running against live*/) {
            config = new HttpSelfHostConfiguration(HostBaseAddress);
            WebApiConfig.Register(config); // init your web api application
            var server = new HttpSelfHostServer(config);
            server.OpenAsync().Wait();
        }
    }

    public void Dispose() {
        if (server != null) {
            server.CloseAsync().Wait();
            server.Dispose();
            server = null;

            config.Dispose();
            config = null;
        }
    }
}

然后定义一个将使用该夹具的集合。集合是在xUnit 2中对测试进行分组的新概念。

[CollectionDefinition("SelfHostCollection")]
public class SelfHostCollection : ICollectionFixture<SelfHostFixture> {}

它只是一个标记,所以没有实现。 现在,标记依赖于您的主机的测试:

[Collection("SelfHostCollection")]
public class MyController1Test {}

[Collection("SelfHostCollection")]
public class MyController4Test {}

MyController1TestMyController4Test内运行任何测试时,跑步者将创建一个灯具实例,确保每个集合只启动一次服务器。

答案 1 :(得分:0)

我建议使用内存服务器来测试您的控制器,这样您就不需要在单元测试中启动自托管。

http://blogs.msdn.com/b/youssefm/archive/2013/01/28/writing-tests-for-an-asp-net-webapi-service.aspx