如何将 Moq 配置为每次调用 return 个新实例?
How can I configure Moq to return new instance per call?
我正在尝试用最小起订量编写一个简单的测试。
第二次调用模拟方法时,在更改第一次调用的 return 值后,moq 框架 returns 修改后的对象。我想这是因为我正在更改相同的引用。
如何确保对最小起订量的每次调用都会 return 相同的值?
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;
}
}
你可以这样做
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());
这在所有情况下都会给你相同的结果
你的问题措辞混乱。
How can I ensure that each call to the moq will return the same value?
这表明您需要相同的值,相反,它应该是 "How can I configure Moq to return new instance per call?"。
为此,您必须使用 Returns
方法的另一个重载,该方法将 Func<T>
作为参数并传递一个 lambda。您编写的代码将 Moq 配置为 return 对 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
}
我正在尝试用最小起订量编写一个简单的测试。 第二次调用模拟方法时,在更改第一次调用的 return 值后,moq 框架 returns 修改后的对象。我想这是因为我正在更改相同的引用。
如何确保对最小起订量的每次调用都会 return 相同的值?
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;
}
}
你可以这样做
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());
这在所有情况下都会给你相同的结果
你的问题措辞混乱。
How can I ensure that each call to the moq will return the same value?
这表明您需要相同的值,相反,它应该是 "How can I configure Moq to return new instance per call?"。
为此,您必须使用 Returns
方法的另一个重载,该方法将 Func<T>
作为参数并传递一个 lambda。您编写的代码将 Moq 配置为 return 对 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
}