在单元测试中使用MOQ时找不到的方法

时间:2018-01-05 02:04:08

标签: c# unit-testing moq

我在设置单元测试时遇到问题,我需要Moq HttpClient。在我的代码中,我有一个HttpClient的装饰器,它遵循一个接口。

public class WHttpClient: IWHttpClient{
    HttpClient _client = new HttpClient();
    ...
    public async Task<HttpReponseMessage> PostAsJsonAsync<T>(string url, T content)
    {
        //Do Something
        return await _client.PostAsJsonAsync(url, content);
    }
    ...
}

public interface IWHttpClient{
    HttpRequestHeaders DefaultRequestHeaders {get;}
    Task<HttpResponseMessage> PostAsXmlAsync<T>(string url, T content);
    Task<HttpResponseMessage> PostAsJsonAsync<T>(string url, T content);
    Task<HttpResponseMessage> PostAsync<T>(string url, T content);
    Task<HttpResponseMessage> GetAsync(string url);
    Task<T> GetAsync<T>(string url);
    Task<T> ReadAsAsync<T>(HttpResponseMessage response);
    T Read<T>(HttpResponseMessage response);
}

[TestClass]
public class UnitTest1
{
    private class WorkClass
    {
        private IWHttpClient _client;
        public WorkClass(IWHttpClient client)
        {
            _client = client;
        }
        public void DoWork()
        {
            var url = "DUMMY";
            var content = new ObjectToSerialize();
            Task.Run(() => _client.PostAsJsonAsync(url, content));
        }

    }
    public class ObjectToSerialize
    {

    }
    [TestMethod]
    public void TestMethod1()
    {
        Mock<IWHttpClient> _webClientMock = new Mock<IWHttpClient>(MockBehavior.Strict);
        var url = "DUMMY";
        var content = new ObjectToSerialize();
        _webClientMock.Setup(x => x.PostAsJsonAsync(url, It.IsAny<ObjectToSerialize>())).Returns(Task.FromResult(new HttpResponseMessage(System.Net.HttpStatusCode.OK)));
        var myClassToTest = new WorkClass(_webClientMock.Object);
        myClassToTest.DoWork();
    }
}

它成功构建,但是当我运行测试时,它给了我异常: System.MissingMethodException:找不到方法:&#39; System.Threading.Tasks.Task&#39; 1 SomeNamespace.IWHttpClient.PostAsJsonAsync(System.String,!! 0)&#39;。 < / p>

在我运行测试时,我花了好几个小时试图弄清楚为什么会出现这种异常。我已经对我的解决方案进行了清理和重建,但它仍然可以替换模拟设置中的输入:

(It.IsAny<string>(), It.IsAny<object>())

有没有人知道什么是错的? 运行结果: enter image description here

1 个答案:

答案 0 :(得分:0)

以下最小的例子只是尝试重现您的问题,并演示如何进行这样的测试。

[TestClass]
public class MyTestClass {

    private class WorkClass {
        private IWHttpClient _client;
        public WorkClass(IWHttpClient client) {
            _client = client;
        }

        public async Task DoWork() {
            var url = "DUMMY";
            var content = new ObjectToSerialize();
            var response = await _client.PostAsJsonAsync(url, content);
        }
    }

    public class ObjectToSerialize {

    }

    [TestMethod]
    public async Task MyTestMethod() {
        //Arrange
        var expectedResponse = new HttpResponseMessage(System.Net.HttpStatusCode.OK);
        var _webClientMock = new Mock<IWHttpClient>(MockBehavior.Strict);
        _webClientMock
            .Setup(_ => _.PostAsJsonAsync(It.IsAny<string>(), It.IsAny<ObjectToSerialize>()))
            .ReturnsAsync(expectedResponse)
            .Verifiable();
        var myClassToTest = new WorkClass(_webClientMock.Object);

        //Act
        await myClassToTest.DoWork();

        //Assert
        _webClientMock.Verify();
    }
}

当运动时,测试表现如预期并通过。即使设置已更改为

.Setup(_ => _.PostAsJsonAsync(It.IsAny<string>(), It.IsAny<object>()))

查看并与您当前的测试进行比较,以帮助确定可能出现的错误。

相关问题