当解决方案还包含WinForms测试时,WebApi测试在内存托管中使用挂起

时间:2012-07-26 17:49:44

标签: asp.net nunit asp.net-web-api

我有一个包含许多不同项目的解决方案,包括WinForms和WebApi(RC)。当先前的测试实例化一个派生自System.Windows.Forms.Form的类时,我发现WebApi测试挂起的问题。您可以在此处找到演示此问题的示例解决方案:https://dl.dropbox.com/u/3688049/SampleSolutions/TestSolution.zip

该解决方案已启用NuGet包恢复,因此所有依赖项都应在构建时下拉。

如果未注释掉Class1.cs中的var form = new Form1();调用,则测试将挂起(使用nunit的最新nuget版本)。如果它被注释掉,则测试通过。

非常感谢任何帮助。

的Class1.cs

[TestFixture]
public class Class1
{
    [Test]
    public void AaaWindowsFormsApp() {
        // If this line is not commented out the BbbTestWebApiApp test will hang.
        var form = new Form1();
    }

    [Test]
    public void BbbTestWebApiApp() {
        var config = new HttpConfiguration();
        var server = new HttpServer(config, new MyMessageHandler());
        var client = new HttpClient(server);

        var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/");

        var response = client.SendAsync(request).Result;

        Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
    }
}

MyMessageHandler.cs

public class MyMessageHandler: DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
        return Task.Factory.StartNew(() => request.CreateResponse(HttpStatusCode.OK));
    }
}

更新

似乎将RequiresSTA属性添加到System.Windows.Forms.Form测试可以解决问题。

我不确定为什么添加WebApi内存主机会暴露这个问题。

更新2

如果您通过GUI运行测试,

RequiresSTA似乎只会有所帮助。控制台运行器似乎仍然挂起。

1 个答案:

答案 0 :(得分:1)

这看起来像nUnit处理WinForms的错误。

我运行了你的解决方案并注意到:

  1. 如果将WebAPI和WinForms测试方法分开,它就可以工作 不同的班级
  2. 如果您在WebAPI测试方法
  3. 之后运行WinForms测试方法,它将起作用
  4. 测试与xUnit
  5. 完美配合

    如果其中任何一个对你来说都是可以接受的,我会这样做而不用担心nUnit(也许我说的是因为我在xUnit中完成所有工作:))