使用Moq测试抽象类

时间:2013-12-15 06:26:46

标签: c# unit-testing testing nunit moq

我正在尝试对抽象类中的方法运行单元测试。我浓缩了下面的代码:

抽象类:

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

3 个答案:

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