Moq:第二次通话时没有获得相同的对象

时间:2015-08-04 10:21:12

标签: c# .net unit-testing mocking moq

我正在尝试用moq编写一个简单的测试。 在第二次调用mocked方法时,在从第一次调用更改返回值之后,moq框架返回修改后的对象。我想这是因为我正在改变相同的参考。

如何确保每次调用moq都会返回相同的值?

public class VersionData
{
    public int Number { get; set; }
    public string Str { get; set; }
}

public interface ILogic
{
    VersionData GetVersion();
}

[TestClass]
public class LogicTester
{
    private Mock<ILogic> _mock;

    [TestInitialize]
    public void InitSingleTest()
    {
        _mock = new Mock<ILogic>();
    }

    [TestMethod]
    public void Test()
    {
        _mock.Setup(x => x.GetVersion()).Returns(new VersionData { Number = 1, Str = "1" });

        VersionData l1 = _mock.Object.GetVersion(); // OK
        l1.Number = 2;
        l1.Str = "2";


        // Not OK - I'd expect l2.Number = 1 and l2.Str = "1" but l2.Number = 2 and l2.Str = "2"
        VersionData l2 = _mock.Object.GetVersion(); 

        return;
    }
}

2 个答案:

答案 0 :(得分:2)

你的问题令人困惑。

  

如何确保每次调用moq都会返回相同的值?

它表明您需要相同的值,而应该是“如何配置Moq以便每次调用返回新实例?”。

为此,你必须使用Returns方法的另一个重载,该方法将Func<T>作为参数并传递lambda。您编写的代码将Moq配置为针对GetVersion方法的所有调用返回相同的实例。

因此,您的测试方法变为

[TestMethod]
public void Test()
{
    _mock.Setup(x => x.GetVersion())
         .Returns(() => new VersionData { Number = 1, Str = "1" });

    VersionData l1 = _mock.Object.GetVersion(); // OK
    l1.Number = 2;
    l1.Str = "2";

    VersionData l2 = _mock.Object.GetVersion();

    Assert.AreNotSame(l1, l2);//True as mock returns new instance
}

答案 1 :(得分:0)

你可以做这样的事情

private static VersionData Get()
{
     return new VersionData { Number = 1, Str = "1" };
}

将上述方法称为

_mock.Setup(x => x.GetVersion()).Returns(Get());

VersionData l1 = _mock.Object.GetVersion(); // OK
l1.Number = 2;
l1.Str = "2";

VersionData l2 = _mock.Object.GetVersion().Returns(Get());

这会在所有情况下给你相同的结果