【问题标题】: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());
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-08
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多