2017-06-18 16 views
0

を返します。2番目の要求は、私は次のセットアップ持っている503サービスを使用できません

1)APIのテストのための基底クラス

public class BaseApiTest 
{ 
    private static readonly Uri BaseUri = new Uri("http://localhost"); 
    private static HttpServer _server; 

    internal BaseApiTest() 
    { 
     var config = new HttpConfiguration 
     { 
      IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always 
     }; 

     WebApiConfig.Register(config); 
     _server = new HttpServer(config); 
    } 

    ~BaseApiTest() 
    { 
     _server.Dispose(); 
    } 

    protected static HttpResponseMessage GetHttpResponseMessageFrom(HttpMethod method, string relativeUri) 
    { 
     using (var client = new HttpMessageInvoker(_server)) 
     { 
      var absoluteUri = new Uri(BaseUri, relativeUri); 

      var message = new HttpRequestMessage(method, absoluteUri); 

      var response = client.SendAsync(message, CancellationToken.None); 

      return response.Result; 
     } 
    } 

2)私がテストしたい各コントローラのクラスの拡張:

[TestClass] 
public class ChemicalApiTest : BaseApiTest 
{ 
    private const string ControllerRoutePrefix = "/api/customers/316"; 

    [TestMethod] 
    public void SomeTest() { 

     // Act 
     var response = 
      GetHttpResponseMessageFrom(HttpMethod.Get, ControllerRoutePrefix + "/suppliers"); 
     Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); // this is OK 

     response = 
      GetHttpResponseMessageFrom(HttpMethod.Get, ControllerRoutePrefix + "/suppliers"); 
     Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); // This fails with 503 
    } 
} 

だから、httpサーバーは最初のクエリにしか反応しないと思います。 (どこかのドキュメントでそれを見ることはありません)なぜそれを修正する方法を、ということで、どのように私は知っている可能性が

EDITは問題は二回、クライアントHttpMessageInvokerをインスタンス化するから来ていることが判明します。下のコードスニペットのようにBasiApiTestクラスをリファクタリングすると、正常に動作します。しかし、私はまだ私の質問に興味があります。

public class BaseApiTest 
{ 
    private static readonly Uri BaseUri = new Uri("http://localhost"); 
    private static HttpMessageInvoker _client; 

    internal BaseApiTest() 
    { 
     var config = new HttpConfiguration 
     { 
      IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always 
     }; 

     WebApiConfig.Register(config); 
     var server = new HttpServer(config); 
     _client = new HttpMessageInvoker(server); 
    } 

    ~BaseApiTest() 
    { 
     _client.Dispose(); 
    } 

    protected static HttpResponseMessage GetHttpResponseMessageFrom(HttpMethod method, string relativeUri) 
    { 
     var absoluteUri = new Uri(BaseUri, relativeUri); 

     var message = new HttpRequestMessage(method, absoluteUri); 

     var response = _client.SendAsync(message, CancellationToken.None); 

     return response.Result; 
    } 
} 
+0

'GetHttpResponseMessageFrom'と' BaseApiTest'のソースコードを表示できますか? – mjwills

+1

@mjwillsは両方とも私のポストにあります。最初のコードセグメントには '' GetHttpResponseMessageFrom''メソッドを持つ '' BaseApiTest''クラスがあります – LIvanov

答えて

1

それはHttpMessageInvokerクラスが2つのコンストラクタを持っていることが判明:

HttpMessageInvoker(HttpMessageHandler); 
HttpMessageInvoker(HttpMessageHandler, Boolean); 

new HttpMessageInvoker(server, true)と応じたと同等ですnew HttpMessageInvoker(server)を呼び出す私の場合に第1の1が、true値を有する第二にチェーンされますto specificationは、このインスタンスがハンドラを廃棄するかどうかを示すの値です。

  1. デフォルトの動作が、指定された依存関係を配置することで、なぜ私には不自然に思える何

    です。

  2. デフォルトの動作は文書化されていません。

しかし、最初の質問は個人的な意見であり、2番目の質問はまだこのトピックの完全性について回答することができます。

関連する問題