1

リポジトリ レイヤー内で Web Api メソッドを呼び出しています。誰でもモッキングを使用してテストする方法を提案できますか

4

1 に答える 1

8

Web API メソッドの呼び出しをモックしたい場合は、それを呼び出しているコードを抽象化する必要があります。

それを抽象化します:

public interface IMyApi
{
    MyObject Get();
}

次に、HttpClient を使用して実際の API を呼び出す、このインターフェイスの特定の実装を作成できます。

public class MyApiHttp: IMyApi
{
    private readonly string baseApiUrl;
    public MyApiHttp(string baseApiUrl)
    {
        this.baseApiUrl = baseApiUrl;
    }

    public MyObject Get()
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = this.baseAddress;
            var response = client.GetAsync('/api/myobjects').Result; 
            return response.Content.ReadAsAsync<MyObject>().Result;
        }
    }
}

これで、リポジトリ レイヤーはこの抽象化をコンストラクター引数として単純に受け取ります。

public class Repository: IRepository
{
    private readonly IMyApi myApi;
    public Repository(IMyApi myApi)
    {
        this.myApi = myApi;
    }

    public void SomeMethodThatYouWantToTest()
    {
        var result = this.myApi.Get();
        ...
    }
}

次の単体テストでは、お気に入りのモック フレームワークを使用して API へのアクセスをモックするのは簡単です。たとえば、NSubstitute を使用した単体テストは次のようになります。

// arrange
var myApiMock = Substitute.For<IMyApi>();
var sut = new Repository(myApiMock);
var myObject = new MyObject { Foo = "bar", Bar = "baz" };
myApiMock.Get().Returns(myObject);

// act
sut.SomeMethodThatYouWantToTest();

// assert
...
于 2013-01-11T11:28:27.233 に答える