すでに@Rajによって提示された優れたアイデアに代わるものとして、下のステップに行くために、および/偽を模擬することが可能です代わりに。
HttpClient
を必要とするクラスをコンストラクタ内の依存性注入パラメータとして受け入れる場合は、ユニットテスト時に自分でHttpMessageHandler
を注入したHttpClient
を渡すことができます。以下のように、この単純なクラスでは、あなたが実装する必要がある唯一の1つの抽象メソッドを持っています
public class FakeHttpMessageHandler : HttpMessageHandler
{
public HttpRequestMessage RequestMessage { get; private set; }
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
RequestMessage = request;
return Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK));
}
}
私の簡単な例だけでは、後で検査のために公共の財産でHttpRequestMessage
を保存し、HTTP 200(OK)を返しますが、返される結果を設定するコンストラクタを追加することでこれを補うことができます。あなたはこのように、このクラスを使用すると思い
:このアプローチには限界が
public void foo()
{
//Arrange
var fakeHandler = new FakeHttpMessageHandler();
var client = new HttpClient(fakeHandler);
var SUT = new ClassUnderTest(client);
//Act
SUT.DomSomething();
//Assert
fakeHandler.RequestMessage.Method.ShouldEqual(HttpMethod.Get); // etc...
}
あり、複数の要求を行うか、複数のHttpClient
Sを作成する必要がある方法で、たとえば、その後、偽のハンドラが開始される可能性がありますあまりにも複雑になる。しかし、単純な場合には考慮する価値があるかもしれません。
回答ありがとうございます。私はラッパーのアプローチで終わった。私がもう一度やらなければならないのであれば、おそらくTypeMockやMSソリューションの1つのようなものを使うでしょう。 –
私は当初、密閉クラス内の特定のものの具体的な実装を書いていましたが、内側にしっかりと結合されました。しかし、私はあなたが言及したように 'Moq'でうまく動作するテストを実現するために今すぐ実現します。カバレッジ。私はこれをしなければならないことを知っていました。私はただそれを探して、怠け者ではないことを自分自身に納得させなければなりませんでした:D – ppumkin