如何通过在接口中包装 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 以更好地理解模拟框架。