如何使用Moq框架模拟简单方法?

时间:2019-03-03 14:36:28

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

比方说,我有一个简单的方法,可以检查传递的数字是否为偶数并返回布尔值。我是模拟和尝试的新手。如何使用Moq框架模拟此方法?

public bool isEven(int x)
        {
            bool result = (x % 2 == 0) ? true : false;
            return result;
        }

1 个答案:

答案 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();