[英]c# xUnit Moq It.IsAny<object> not mocking as expected
以下是一段代码(简单的 HTTP post 调用),我试图在 Azure 函数中模拟:
await httpClient.PostAsync("https://url.com", await File.ReadAllTextAsync(Path.Combine(Environment.GetEnvironmentVariable("APP_DIRECTORY"), "file.json"));
请注意,httpClient.PostAsync() 函数有两个参数:URL 作为字符串,body 作为对象。
现在,在我的测试中,我像这样模拟这个 POST 调用:
httpClientMock.Setup(s => s.PostAsync(It.IsAny<string>(), It.IsAny<object>())).ReturnsAsync(mockedHttpResponse);
我期待await File.ReadAllTextAsync(Path.Combine(Environment.GetEnvironmentVariable("APP_DIRECTORY"), "file.json")
不会被调用,因为我将它设置为与任何对象一起工作。但是,我的测试用例失败了例外:
在 System.IO.Path.Combine(String path1, String path2) 处发现 System.ArgumentNullException 消息“Value cannot be null. (Parameter 'path1')”
当我通过在测试中设置环境变量来提供正确的路径(即使是虚拟路径也不起作用)时,它就起作用了。 但这似乎不是正确的方法,因为单元测试旨在在各种机器上运行,并且每台机器的基本路径都不同。
File.ReadAllTextAsync()
返回一个字符串,因此您的 MOQ 设置应该将It.IsAny<string>()
作为第二个参数而不是It.IsAny<object>()
。
答案是您实际上并没有拦截对File.ReadAllTextAsync(...);
的调用。
请记住
await httpClient.PostAsync("https://url.com",
await File.ReadAllTextAsync(Path.Combine(Environment.GetEnvironmentVariable("APP_DIRECTORY"), "file.json"));
在功能上与:
var fileContent = await File.ReadAllTextAsync(Path.Combine(Environment.GetEnvironmentVariable("APP_DIRECTORY"), "file.json");
await httpClient.PostAsync("https://url.com", fileContent);
这样更明显的是,即使您模拟httpClient.PostAsync
,对File.ReadAllTextAsync
的调用仍然会发生。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.