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

How can I mock a simple method using Moq framework?

假设我有一个简单的方法来检查传递的数字是否为 Even & returns 布尔值。我是嘲笑和尝试的新手。如何使用 Moq 框架模拟此方法?

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

假设方法是接口的一部分:

public interface IMyInterface
{
   bool isEven(int x);
}

你用来模拟它的是:

Mock<IMyInterface> myMock = new Mock<IMyInterface>();
myMock.Setup(x => x.isEven(It.Any<int>())).Returns(true);

这意味着什么,它将以某种方式设置方法,无论作为参数传递的值如何,都将 return 为真。

然后您可以将该 Mock 传递给其他 class / 依赖项,如下所示:

var myNewObject = new Whateverclass(myMock.Object)

如果您的方法存在于具体 class 中,您仍然可以这样做,但您需要将您的方法标记为 virtual。其余过程完全相同。

Moq 在它下面做的是创建它自己的实例 class(如代理)并为已配置的成员(方法、属性)放置 return 值在设置方法中。

编辑:

具体例子:

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