gpt4 book ai didi

c# - 如何在模拟中为不同的输入返回不同的值?

转载 作者:太空狗 更新时间:2023-10-29 23:19:58 25 4
gpt4 key购买 nike

[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var o1 = new XmlDocument();
var o2 = new XmlDocument();

var mock = new Mock<ITestInterface>();
mock.Setup(m => m.TestMethod(o1)).Returns(1);
mock.Setup(m => m.TestMethod(o2)).Returns(2);

Assert.AreEqual(1, mock.Object.TestMethod(o1));
Assert.AreEqual(2, mock.Object.TestMethod(o2));
}
}

public interface ITestInterface
{
int TestMethod(object input);
}

为什么 mock 总是返回第二个值?如果我将 XmlDocument 切换为其他任何东西(对象、StringBuilder 等),它将按预期工作。

最佳答案

我本以为它也会像您预期的那样工作,但我也得到了相同的结果。但是,如果您改为按以下方式进行设置,它将按您希望的方式工作。

mock.Setup(m => m.TestMethod(It.Is<XmlDocument>(y => ReferenceEquals(o1, y)))).Returns(1);
mock.Setup(m => m.TestMethod(It.Is<XmlDocument>(y => ReferenceEquals(o2, y)))).Returns(2);

我在进一步测试时注意到的另一件事是,如果您设置 InnerXml,一切都会像您最初设置的那样工作。

var doc1 = new XmlDocument { InnerXml = "<root1 />" };
var doc2 = new XmlDocument { InnerXml = "<root2 />" };;
mock.Setup(x => x.TestMethod(doc1)).Returns(1);
mock.Setup(x => x.TestMethod(doc2)).Returns(2);

Console.WriteLine($"{mock.Object.TestMethod(doc1)}");
Console.WriteLine($"{mock.Object.TestMethod(doc2)}");

如果您将两个 InnerXml 值设置为相同的字符串,它甚至可以工作。这真是一个谜,我一直无法解释。

关于c# - 如何在模拟中为不同的输入返回不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52263472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com