c#xUnit Moq It.IsAny<;对象>;没有预料到的嘲弄

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作为

下面是一段代码(简单的HTTP post调用),我正在尝试在Azure函数中进行模拟:

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呃,当然,在不重写实际代码的情况下,如何处理这些情况?请展示您的完整测试;否则,我们只是猜测您是如何设置的。此外,
,因为单元测试打算在各种机器上运行
:这意味着它们是集成测试,而不是单元测试。以前尝试过。不起作用。请参考乔纳森对最初问题的评论似乎是正确的。