比方说,我有一个简单的方法,可以检查传递的数字是否为偶数并返回布尔值。我是模拟和尝试的新手。如何使用Moq框架模拟此方法?
public bool isEven(int x)
{
bool result = (x % 2 == 0) ? true : false;
return result;
}
答案 0 :(得分:4)
让我们假设方法是接口的一部分:
public interface IMyInterface
{
bool isEven(int x);
}
要模拟它的方式是:
Mock<IMyInterface> myMock = new Mock<IMyInterface>();
myMock.Setup(x => x.isEven(It.Any<int>())).Returns(true);
这意味着,它将以某种方式设置方法,无论传递给参数的值如何,都将返回true。
然后您可以将该Mock传递给其他类/依赖项,如下所示:
var myNewObject = new Whateverclass(myMock.Object)
如果您的方法位于具体的类中,您仍然可以这样做,但是您需要将您的方法标记为virtual
。其余过程完全相同。
Moq
在其下执行的操作将创建其自己的类的实例(例如代理),并将已在设置方法中配置的成员(方法,属性)的返回值放入。
具体示例:
public class MyClass
{
public virtual bool isEven(int x) {
return (x % 2 == 0);
}
}
要模拟它的方式是:
Mock<MyClass> myMock = new Mock<MyClass>();
myMock.Setup(x => x.isEven(It.Any<int>())).Returns(true);
var myNewObject = new Whateverclass(myMock.Object)
最后是部分实现:
public class MyClass
{
public virtual bool isEven(int x) {
return (x % 2 == 0);
}
public bool OtherMethod() {
return !isEven();
}
}
Mock<MyClass> myMock = new Mock<MyClass>();
myMock.CallBase = true;
myMock.Setup(x => x.isEven(It.Any<int>())).Returns(true);
var result = myMock.Object.OtherMethod();