Moq正在进行方法调用并返回实际数据,而不是Setup中的返回数据

时间:2015-10-26 20:57:51

标签: c# mocking moq

我正在尝试返回静态声明的NWatchNativeNode []数组,但是Moq似乎实际上正在调用获取真实系统数据的真实方法。以下设置是否不正确?

我想确保在

GetNodesInCriticalCondition()被调用,返回criticalNodes1

单元测试代码

var criticalNodes1 = new NWatchNativeNode[]
{
    factory.CreateNativeNode(NWatchNodeType.NetworkSwitch,
        "MySwitch",
        "MyAlias",
        12345
        ),
    factory.CreateNativeNode(NWatchNodeType.NetworkSwitch,
        "MySwitch2",
        "MyAlias2",
        54321
        ),
};

var mock = new Mock<NWatchCasModelStatusScheduleEntry>(_application);
mock.Setup(x => x.GetNodesInCriticalCondition()).Returns(criticalNodes1);

var nodes = mock.Object.GetNodesInCriticalCondition();
Assert.AreEqual(2, nodes.Length);  // This should return true

2 个答案:

答案 0 :(得分:1)

Mock返回实际系统数据的最可能原因是您的方法GetNodesInCriticalCondition()未声明为virtual

为了让Moq能够设置方法调用,这些方法必须是virtual,否则它不能覆盖它们,因此无法拦截它们,这会导致调用原始方法

修改
如果您的方法为internal,则必须授予单元测试项目 Moq 的访问权限。
你可以通过添加
来做到这一点 [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
[assembly: InternalsVisibleTo("TestProjectNameSpace")]
到您要为其创建模拟的项目的AssemblyInfo.cs文件。

答案 1 :(得分:0)

根据您的要求,以下是如何使用Moq进行测试的快速示例。

让我们开始测试一些类和接口。

public interface IFoo
{
    IEnumerable<int> GetFoos();
}

public class Foo : IFoo
{
    public IEnumerable<int> GetFoos()
    {
        return Enumerable.Range(1, 10);
    }
}

public class Bar
{
    private readonly IFoo foo;

    public Bar(IFoo foo)
    {
        this.foo = foo;
    }

    public IEnumerable<int> SquareFoos()
    {
        foreach(var item in foo.GetFoos())
        {
            yield return item * item;
        }
    }
}

现在,Bar依赖于IFoo接口。现在我们要在SquareFoos类上测试Bar的功能。这是我们的测试对象。我们想要模拟的是传递给IFoo的构造函数的Bar接口。这为我们提供了以下单元测试设置。

// Arrange
var mock = new Mock<IFoo>();
mock.Setup(m => m.GetFoos()).Returns(Enumerable.Range(1, 2));

var sut = new Bar(mock.Object);

// Act
var results = sut.SquareFoos().ToList();

// Assert
Assert.AreEqual(2, results.Count);

在这种情况下,我们会模拟GetFoos返回的内容,以便我们测试Bar类。