模拟接口ReturnsAsync返回null

Dar*_*ght 3 c# unit-testing moq

我试图Mock一个Interface具有单个Task<string>方法.

这里的Q相同,但我似乎无法让代码对我有利:在Moq Framework中设置异步任务回调

我的界面如下所示:

public interface IHttpClient
{
    Task<string> GetStringAsync(string uri);
}
Run Code Online (Sandbox Code Playgroud)

我试图嘲笑这样:

var mockHttp = new Mock<IHttpClient>();
mockHttp.Setup(m => m.GetStringAsync("aPretendUrl")).ReturnsAsync("Some sort of string");
Run Code Online (Sandbox Code Playgroud)

我发现结果GetStringAsyncnull

在注入此实例的控制器中,我将其称为:

string responseData = await _client.GetStringAsync(url);

也试着

string responseData = _client.GetStringAsync(url).Result;

responseDatanull在所有情况下.

我确信我错过了一些简单的事情.单元测试仍然是新的

谁能指出我哪里出错了?

更新

完整的单元测试如下所示:

[Test]
public void Given_EController_Called_With_unknown_pedi_Returns_NotFound()
{
    // Arrange
    AppSettings settings = new AppSettings()
    {
        DataWarehouseAPI = "http://myurl.com"
    };
    Mock<IOptionsSnapshot<AppSettings>> mockSettings = new Mock<IOptionsSnapshot<AppSettings>>();
    mockSettings.Setup(m => m.Value).Returns(settings);

    var mockHttp = new Mock<IHttpClient>();
    mockHttp.Setup(m => m.GetStringAsync("aPretendUrl")).ReturnsAsync("[]");

    EntryController controller = new EntryController(mockHttp.Object, mockSettings.Object);

     // Act
    IActionResult actionResult = controller.GetByPedimento("nothing").Result;

    // Assert
    Assert.IsAssignableFrom<NotFoundObjectResult>(actionResult);
    }
Run Code Online (Sandbox Code Playgroud)

rud*_*nek 6

如果您不关心测试中的"url",那么您可以使用:

It.IsAny<string>()
Run Code Online (Sandbox Code Playgroud)

结果:

mockHttp.Setup(m => m.GetStringAsync(It.IsAny<string>()))
    .ReturnsAsync("Some sort of string");
Run Code Online (Sandbox Code Playgroud)

如果在设置中指定'uri'参数,则必须在测试中将其匹配,以从方法中获得所需的返回值"某种字符串".您可以为不同的输入指定不同的结果:

[TestMethod]
public async Task GetStringAsync_moqSetup()
{
    var mockHttp = new Mock<IHttpClient>();

    mockHttp.Setup(m => m.GetStringAsync(It.IsAny<string>()))
        .ReturnsAsync("Other sort of string");
    mockHttp.Setup(m => m.GetStringAsync("first"))
        .ReturnsAsync("First sort of string");

     var firstTarget = await mockHttp.Object.GetStringAsync("first");
     var differentTarget = await mockHttp.Object
         .GetStringAsync("something completely different");

    Assert.AreEqual("First sort of string", firstTarget);
    Assert.AreEqual("Other sort of string", differentTarget);
}
Run Code Online (Sandbox Code Playgroud)

查看框架的快速入门,以便更好地了解如何使用它.