【问题标题】:Using Moq To Test An Abstract Class使用 Moq 测试抽象类
【发布时间】:2014-01-02 17:15:40
【问题描述】:
我正在尝试对抽象类中的方法运行单元测试。我已经压缩了下面的代码:
抽象类:
public abstract class TestAb
{
public void Print()
{
Console.WriteLine("method has been called");
}
}
测试:
[Test]
void Test()
{
var mock = new Mock<TestAb>();
mock.CallBase = true;
var ta = mock.Object;
ta.Print();
mock.Verify(m => m.Print());
}
消息:
Method is not public
我在这里做错了什么?我的目标是使用 Moq 框架测试抽象类中的方法。
【问题讨论】:
标签:
c#
unit-testing
testing
nunit
moq
【解决方案1】:
如果您想在这样的抽象类上模拟方法,则需要将其设为虚拟或抽象。
【解决方案2】:
该消息是因为您的Test() 方法不是public。测试方法需要public。即使在创建测试方法public 之后,它也会失败,因为您只能验证abstract/virtual 方法。因此,在您的情况下,您必须创建 virtual 方法,因为您已经实现了。
【解决方案3】:
我的answer 有类似的问题:
作为一种解决方法,您可以不使用方法本身,而是创建虚拟包装方法
public abstract class TestAb
{
protected virtual void PrintReal(){
Console.WriteLine("method has been called");
}
public void Print()
{
PrintReal();
}
}
然后在测试类中重写:
abstract class TestAbDelegate: TestAb{
public abstract override bool PrintReal();
}
测试:
[Test]
void Test()
{
var mock = new Mock<TestAbDelegate>();
mock.CallBase = true;
mock.Setup(db => db.PrintReal());
var ta = mock.Object;
ta.Print();
mock.Verify(m => m.PrintReal());
}