1

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

该解决方案启用了 NuGet 包还原,因此所有依赖项都应在构建时被拉下。

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

任何帮助将不胜感激。

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

RequiresSTA只有当您通过 GUI 运行测试时,它似乎才有帮助。控制台运行器似乎仍然挂起。

4

1 回答 1

1

这看起来确实像 nUnit 处理 WinForms 中的一个错误。

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

  1. 如果您将 WebAPI 和 WinForms 测试方法分成不同的类,它会起作用
  2. 如果您在 WebAPI 测试方法之后运行 WinForms 测试方法,它会起作用
  3. 测试与 xUnit 完美配合

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

于 2012-07-26T18:47:07.997 回答