moqmoq入门


备注

Moq是.Net的模拟库。它允许模拟和验证与依赖关系的交互,以便于单元测试。

可在此处找到不同版本Moq的发行说明。

安装或设置

  1. 选择要添加对Moq的引用的项目。
  2. 打开这个项目的Nuget。
  3. 选择“浏览”而不是在搜索框中键入“moq”。
  4. 选择“Moq”,然后单击“安装”。

在此处输入图像描述

按照这些步骤安装Moq软件包,并在选定的项目引用中添加对它的引用。完成这些步骤后,只需在测试类文件中声明它,就可以在单元测试项目中使用Moq:

Using Moq;
 

Moq是测试双打

模拟是指测试双打,允许验证与模拟的交互,它们并不意味着取代您正在测试的系统。示例通常会演示Moq的功能如下:

// Create the mock
var mock = new Mock<IMockTarget>();

// Configure the mock to do something
mock.SetupGet(x => x.PropertyToMock).Returns("FixedValue");

// Demonstrate that the configuration works
Assert.AreEqual("FixedValue", mock.Object.PropertyToMock);

// Verify that the mock was invoked
mock.VerifyGet(x => x.PropertyToMock);
 

虽然这个例子显示了使用mock所涉及的步骤,但重要的是要记住它实际上并没有测试任何东西,除了模拟已经正确设置和使用。使用模拟的实际测试将模拟提供给要测试的系统。要测试以下方法:

public class ClassToTest
{
    public string GetPrefixedValue(IMockTarget provider)
    {
        return "Prefixed:" + provider.PropertyToMock;
    }
}
 

可以创建依赖接口的模拟:

public interface IMockTarget
{
    string PropertyToMock { get; }
}
 

要创建实际验证GetPrefixedValue 方法行为的测试,请执行GetPrefixedValue

// Create and configure the mock to return a known value for the property
var mock = new Mock<IMockTarget>();
mock.SetupGet(x => x.PropertyToMock).Returns("FixedValue");

// Create an instance of the class to test
var sut = new ClassToTest();

// Invoke the method to test, supplying the mocked instance
var actualValue = sut.GetPrefixedValue(mock.Object);

// Validate that the calculated value is correct
Assert.AreEqual("Prefixed:FixedValue", actualValue);

// Depending on what your method does, the mock can then be interrogated to
// validate that the property getter was called.  In this instance, it's
// unnecessary since we're validating it via the calculated value.
mock.VerifyGet(x => x.PropertyToMock);