c#xUnit Moq It.IsAny<;对象>;没有预料到的嘲弄
下面是一段代码(简单的HTTP post调用),我正在尝试在Azure函数中进行模拟:c#xUnit Moq It.IsAny<;对象>;没有预料到的嘲弄,c#,unit-testing,mocking,moq,xunit,C#,Unit Testing,Mocking,Moq,Xunit,下面是一段代码(简单的HTTP post调用),我正在尝试在Azure函数中进行模拟: await httpClient.PostAsync("https://url.com", await File.ReadAllTextAsync(Path.Combine(Environment.GetEnvironmentVariable("APP_DIRECTORY"), "file.json")); 请注意,httpClient.PostAsync()函数接受两个参数:URL作为字符串,body作为
await httpClient.PostAsync("https://url.com", await File.ReadAllTextAsync(Path.Combine(Environment.GetEnvironmentVariable("APP_DIRECTORY"), "file.json"));
请注意,httpClient.PostAsync()函数接受两个参数:URL作为字符串,body作为对象
现在,在我的测试中,我在模仿这个帖子:
httpClientMock.Setup(s => s.PostAsync(It.IsAny<string>(), It.IsAny<object>())).ReturnsAsync(mockedHttpResponse);
httpClientMock.Setup(s=>s.PostAsync(It.IsAny(),It.IsAny()).ReturnsAsync(mockedHttpResponse);
我原以为wait File.ReadAllTextAsync(Path.Combine(Environment.GetEnvironmentVariable(“APP_目录”),“File.json”)
不会被调用,因为我将其设置为与任何对象一起工作。但是,我的测试用例失败,出现以下异常:
找到System.ArgumentNullException,消息“值不能为null”。
(参数'path1')”
在System.IO.Path.Combine处(字符串路径1、字符串路径2)
当我通过在Test中设置环境变量来提供正确的路径(即使是伪路径也不起作用)时,它是有效的。但这似乎不是正确的方法,因为单元测试要在不同的机器上运行,并且每个机器的基本路径都不相同。
File.ReadAllTextAsync()
返回一个字符串,因此MOQ设置应该将It.IsAny()
作为第二个参数,而不是It.IsAny()
Moq只处理传入的参数,您允许它接受任何对象。创建该对象的方法在发送到Moq函数之前仍然需要求值,这就是它在发送到路径的无效参数上失败的地方。合并
。谢谢@JonathonChase!我现在明白了。Howev呃,当然,在不重写实际代码的情况下,如何处理这些情况?请展示您的完整测试;否则,我们只是猜测您是如何设置的。此外,,因为单元测试打算在各种机器上运行
:这意味着它们是集成测试,而不是单元测试。以前尝试过。不起作用。请参考乔纳森对最初问题的评论似乎是正确的。