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

标签 c# .net unit-testing mocking moq

假设我有一个简单的方法来检查传递的数字是否为偶数并返回一个 bool 值。我是 mock 和尝试的新手。我如何使用 Moq 框架模拟此方法?

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

最佳答案

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

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

你用来模拟它的是:

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

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

然后您可以将该模拟传递给其他类/依赖项:

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

关于c# - 如何使用 Moq 框架模拟一个简单的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54969929/

相关文章:

c# - 如何将异步方法放入列表中并迭代调用它们?

c# - 使用 Newtonsoft json.net 在 C# 中反序列化 JSON 对象

c# - 更改 WebJobs 连接字符串 AzureWebJobsStorage 和 AzureWebJobsDashboard 的默认名称

c# - 什么时候需要 Dispose?

c# - 同一解决方案中的 MVC 和 Web API 项目

使用 MSI 连接到 Azure Vault

java - 如何将我的测试类转换为 JUnit 测试用例?

unit-testing - Angular 11单元测试代码覆盖率现已突破

visual-studio - VS10 调试器错误 : Test host process exited unexpectedly

c# - SqlParameter C# 上的表名和表字段?