10

NUnitを使用してテストをセットアップし、ASP.NETWebApiコントローラーの統合テストを実行しようとしています。HttpServerを使用したインメモリホスティングについて説明している記事をいくつか見つけました。これは、すべてをホストするWebサーバーを必要としないため、物事を単純化するように見えます。

問題は、私が今までに得た唯一の応答が404-見つかりませんです。

コントローラーは、ブラウザーまたはFiddlerを介して手動でテストしたときに機能しています。ルート定義は作業現場からコピーされました。apiプロジェクトはテストプロジェクトによって参照され、dllはテストと同じフォルダーにコピーされます。

前もって感謝します。

これがテストクラスです

[TestFixture]
public class InMemoryTests
{
    private HttpServer Server;
    private string UrlBase = "http://some.server/";

    [TestFixtureSetUp]
    public void Setup()
    {

        var config = new HttpConfiguration();
        config.Routes.MapHttpRoute(name: "Default", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional });
        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

        Server = new HttpServer(config);
    }

    [Test]
    public void GetOrderStatus()
    {
        var client = new HttpClient(Server);
        var request = createRequest("api/Orders/GetOrderStatus?companyCode=001&orderNumber=1234", "application/json", HttpMethod.Get);

        using (HttpResponseMessage response = client.SendAsync(request).Result)
        {
            Assert.IsNotNull(response);
            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
            Assert.NotNull(response.Content);
        }
    }

    private HttpRequestMessage createRequest(string url, string mthv, HttpMethod method)
    {
        var request = new HttpRequestMessage();

        request.RequestUri = new Uri(UrlBase + url);
        request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(mthv));
        request.Method = method;

        return request;
    }

    private HttpRequestMessage createRequest<T>(string url, string mthv, HttpMethod method, T content, MediaTypeFormatter formatter) where T : class
    {
        HttpRequestMessage request = createRequest(url, mthv, method);
        request.Content = new ObjectContent<T>(content, formatter);

        return request;
    }

    public void Dispose()
    {
        if (Server != null)
        {
            Server.Dispose();
        }
    }
}
4

1 に答える 1

9

テストクラスをコントローラーと同じアセンブリに移動すると、この問題も解消されたようです。私が知っているテストでは、一般的に実用的ではありません。

少し掘り下げた後、必要なアセンブリをロードできなかったため、呼び出し元のコードがコントローラーと同じアセンブリを共有していない場合にのみ、セルフホストで発生するバグがあるようです。

これが問題であることを確認するには/一時的な回避策これをテストの最初の行として追加します:-

Type myType = typeof(myControllerType);

詳細については、http://forums.asp.net/t/1772734.aspx/1をご覧ください。

于 2012-08-01T11:13:10.653 に答える