我正在尝试对抽象类中的方法运行单元测试。我浓缩了下面的代码:
抽象类:
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框架测试抽象类中的方法。
答案 0 :(得分:14)
该消息是因为您的Test方法不公开。测试方法需要公开。即使在公开测试方法之后,它也会失败,因为您只能验证抽象/虚拟方法。因此,在您的情况下,您必须将方法设置为虚拟,因为您已实现。
答案 1 :(得分:4)
如果你想在这样的抽象类上模拟方法,那么你需要将它设为虚拟或抽象。
答案 2 :(得分:0)
我的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());
}