我在存储库层中调用 Web Api 方法。任何人都可以建议如何使用 Mocking 进行测试
问问题
2538 次
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 回答