如何通过在接口中包装 HttpClient 来模拟 HttpClient
How To Mock A HttpClient By Wraping HttpClient In A Interface
我想使用 Moq 来模拟我的 HttpClient 调用。我想通过使用一个接口来包装 HttpClient 来做到这一点。我的界面:
public interface IMyHttpClient
{
Task<T> GetJsonAsync<T>(string url);
}
还有我的 class:
public class MyHttpClient : IMyHttpClient
{
private HttpClient http;
public MyHttpClient(HttpClient _http)
{
http = _http;
}
public Task<T> GetJsonAsync<T>(string url)
{
return http.GetFromJsonAsync<T>(url);
}
}
仅供参考:仅显示一种方法。
我的测试是:
var myObj = new MyObj();
Mock moc = new Mock<IMyHttpClient>().Setup(a => a.GetJsonAsync<MyObj>
("url")).Returns(Task.FromResult(myObj));
我收到一个编译器错误:
System.InvalidCastException : Unable to cast object of type
'Moq.Language.Flow.NonVoidSetupPhrase`2[IMyHttpClient,
System.Threading.Tasks.Task`1[MyObject]]' to type 'Moq.Mock'.
我不明白哪里错了。
.Returns()
不是 return 和 Mock
,如错误所示。将声明和设置分开:
var myObj = new MyObj();
Mock<IMyHttpClient> moc = new Mock<IMyHttpClient>();
moc.Setup(a => a.GetJsonAsync<MyObj>("url"))
.ReturnsAsync(myObj);
参考 Moq Quickstart 以更好地理解模拟框架。
我想使用 Moq 来模拟我的 HttpClient 调用。我想通过使用一个接口来包装 HttpClient 来做到这一点。我的界面:
public interface IMyHttpClient
{
Task<T> GetJsonAsync<T>(string url);
}
还有我的 class:
public class MyHttpClient : IMyHttpClient
{
private HttpClient http;
public MyHttpClient(HttpClient _http)
{
http = _http;
}
public Task<T> GetJsonAsync<T>(string url)
{
return http.GetFromJsonAsync<T>(url);
}
}
仅供参考:仅显示一种方法。
我的测试是:
var myObj = new MyObj();
Mock moc = new Mock<IMyHttpClient>().Setup(a => a.GetJsonAsync<MyObj>
("url")).Returns(Task.FromResult(myObj));
我收到一个编译器错误:
System.InvalidCastException : Unable to cast object of type
'Moq.Language.Flow.NonVoidSetupPhrase`2[IMyHttpClient,
System.Threading.Tasks.Task`1[MyObject]]' to type 'Moq.Mock'.
我不明白哪里错了。
.Returns()
不是 return 和 Mock
,如错误所示。将声明和设置分开:
var myObj = new MyObj();
Mock<IMyHttpClient> moc = new Mock<IMyHttpClient>();
moc.Setup(a => a.GetJsonAsync<MyObj>("url"))
.ReturnsAsync(myObj);
参考 Moq Quickstart 以更好地理解模拟框架。