我正在尝试返回静态声明的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
答案 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
类。