Tom*_*ise 0 c# asp.net unit-testing moq
我使用 Moq 编写了以下类和测试类:
public class Mytest : testin
{
public int getId(int id)
{
int s = 2;
return s;
}
}
Run Code Online (Sandbox Code Playgroud)
测试类:
private Mock<testin> _mock;
[TestInitialize]
public void Setup()
{
_mock = new Mock<testin>();
}
[TestMethod]
public void returngetId()
{
// Build up our mock object
_mock.Setup(x => x.getId(It.IsAny<int>())).Returns(1)
}
Run Code Online (Sandbox Code Playgroud)
我从函数返回2,并在单元测试用例中检查值1。根据我的理解,测试用例应该失败。但我收到成功消息。我如何验证返回值正是我所期望的?如果它返回 1 以外的值,我希望测试失败。
您当前的设置将跳过该方法的执行,而是“盲目”返回 1。如果您希望执行该方法,则不应模拟该方法。如果删除设置行,您的测试用例确实会失败。一般来说,只有当您需要不执行某个方法时,才应该模拟该方法。
澄清:
该行_mock.Setup(x => x.getId(It.IsAny<int>())).Returns(1)配置您的模拟对象,以便每当您调用该getId方法(而不是执行它)时,1总是返回该值。因此,以下测试将通过:
[TestMethod]
public void returngetId_Always1()
{
// ... Build up our mock object
_mock.Setup(x => x.getId(It.IsAny<int>())).Returns(1);
Assert.AreEqual(1, _mock.Object.getId("foo"));
Assert.AreEqual(1, _mock.Object.getId("bar"));
}
Run Code Online (Sandbox Code Playgroud)
为了获得从模拟中调用的方法的实际实现,您必须使用以下配置来模拟类,而不是接口:
[TestMethod]
public void returngetId_CallBase()
{
var mock = new Mock<MyTest>() { CallBase = true };
// add other method setups here. DO NOT setup the getId() method.
Assert.AreEqual(2, _mock.Object.getId("foo"));
Assert.AreEqual(2, _mock.Object.getId("bar"));
}
Run Code Online (Sandbox Code Playgroud)
这将允许模拟遵循尚未提供模拟设置的任何方法的基本实现。
| 归档时间: |
|
| 查看次数: |
12350 次 |
| 最近记录: |