[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切换为其他任何东西(object、StringBuilder等),它将按预期工作。
发布于 2018-09-11 05:16:34
我会假设它也会像你预期的那样工作,但我也得到了同样的结果。但是,如果您按照下面的方式进行设置,它将按您所希望的那样工作。
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值设置为相同的字符串,它甚至可以正常工作。这真的是一个谜,我无法解释它。
发布于 2018-09-11 05:56:07
我运行了你的代码,也遇到了同样的问题。在使用Message: Assert.AreEqual failed. Expected:<1>. Actual:<2>.的第一次断言中,完全按照您发布的方式运行代码会失败。当我将o1和o2更改为object而不是XmlDocument时,它按预期工作。
奇怪的是,将两个设置行更改为以下行将导致生成正确的结果:
mock.Setup(m => m.TestMethod(It.Is<XmlDocument>(x => x == o1))).Returns(1);
mock.Setup(m => m.TestMethod(It.Is<XmlDocument>(x => x == o2))).Returns(2);这很奇怪,因为我相信你的两个设置线应该和我的完全一样,但我的在这种情况下工作正常,而你的却不是。我假设有一个我不知道的差异,或者是Moq的错误导致了这一点。
https://stackoverflow.com/questions/52263472
复制相似问题