2016-09-30 7 views
2

私はこのコードを持っていますが、httpClientに何があっても文字列応答を返すことはできません。引数がNSubstituteと正しく動作しない

private HttpResponseMessage StringResponse(string content) 
{ 
    var response = new HttpResponseMessage(HttpStatusCode.OK); 

    if (content != null) 
    { 
     response.Content = new StringContent(content); 
    } 

    return response; 
} 

は私が間違って何をやっている:誰かがこれを再生したい場合はここで

HttpClient httpClient = Substitute.For<HttpClient>(); 

httpClient.PostAsync("/login", Arg.Any<StringContent>()) 
      .Returns(this.StringResponse("{\"token\": \"token_content\"}")); 

Console.WriteLine(await httpClient.PostAsync("/login", new StringContent(string.Empty)) == null); // True 

StringResponse方法ですか?

私は

httpClient.PostAsync("/login", Arg.Any<StringContent>()) 
       .ReturnsForAnyArgs(this.StringResponse("{\"token\": \"token_content\"}")); 

を行う場合には動作しますが、私はちょうど任意の引数を必要としない、私はそれらのいずれかのタイプStringContentであるように、文字列"/login"およびその他する必要があります。

HttpContentのようにArg.Isコールに一般的なものを追加しようとしましたが、それでも機能しません。

.NETコアでNSubstitute 2.0.0-rcを使用していますが、NSubstitute 1.10.0をスタンドアロンコンソールアプリケーションで使用しても同じ結果が得られました。

+0

どのバージョンのnsubstituteを使用していますか? –

+0

.Net Coreで2.0.0-rcを使用していますが、このコードを通常のコンソールアプリケーションで1.10.0で試してみましたが、同じ結果が得られました。 –

+0

Hmm。それを再現しましたが、まだそれを修正することはできませんでした... –

答えて

4

ここでの問題は、public Task<HttpResponseMessage> PostAsync(string requestUri, HttpContent content)メソッドが仮想ではなく、NSubstituteが引数の指定と戻り値をメソッドに正しくリンクできないことです。それはCastle.Coreに基づくすべての模倣ライブラリの問題です。

重要なのは、NSubstituteが、実行スタックの最初の仮想メソッドに仕様をリンクし、public override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)メソッドがスタックのどこかにダウンしていることが判明したことです。同じ戻り値の型を持つことは "幸い"でした。あなたが見ることができるように、それは明らかにあなたが提供したものと一致しない異なる議論を持っています。驚いたことにReturnsForAnyArgs()は、あなたが指定した引数の仕様をチェックしていないので動作します。

+0

私は自分自身でそれを考え出したことはありませんでした、ありがとう! –