使用Moq测试抽象类

24

我正在尝试在抽象类的方法上运行单元测试。下面是我精简后的代码:

抽象类:

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框架测试抽象类中的方法。


你看到这个帖子了吗?http://stackoverflow.com/questions/3604721/how-to-test-a-method-in-an-abstract-class-with-abstract-methods - Dilish
3个回答

23

这个消息的原因是因为您的 Test() 方法不是 public。 测试方法需要是 public 的。 即使将测试方法更改为 public,它仍然会失败,因为您只能验证 abstract/virtual 方法。 所以在您的情况下,您需要将该方法设置为 virtual,因为您有实现。


6

如果你想在像这样的抽象类上模拟方法,那么你需要将其声明为虚拟方法或抽象方法。


3

我在类似的问题中的回答:

作为一种解决方法,您可以使用虚拟包装方法而不是直接使用该方法本身。

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());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接