如何对抽象类进行单元测试

时间:2011-11-01 12:28:32

标签: c# visual-studio unit-testing

在Visual Studio中使用了创建单元测试工具,显然它试图实例化我的抽象类。

我的问题是:我应该尝试单元测试Visual Studio试图让我这样做的方式,还是应该创建一个要实例化的模拟类,还是应该只测试使用这个抽象类的方法?

感谢。

5 个答案:

答案 0 :(得分:55)

如果这个抽象类的方法值得测试,那么你应该测试它们。您总是可以为测试子类化抽象类(并将其命名为MyAbstractClassTesting)并测试这个新的具体类。

答案 1 :(得分:24)

有两种相反的观点:

  • 不要测试抽象类本身,测试从中继承的具体类
  • 抽象类也应该进行测试,因为它提供了一些在所有继承类中共享的内置逻辑,所以你只需要在抽象类中测试一次基本逻辑

我更喜欢第二个选项(当前)并使用RhinoMocks PartialMock功能测试抽象类,这允许我创建一个抽象类的模拟。

答案 2 :(得分:5)

  1. 只需测试实现类。

  2. 您始终可以为测试创建特定的实现,但不会增加额外的功能。

  3. 听取测试。使用魔术的模拟工具来测试抽象类和私有方法等是一种测试代码气味

答案 3 :(得分:0)

从模拟存储库中使用:

[testmethod]
       public void testwithmockrepository()
       {
           var mockrepository = new rhino.mocks.mockrepository();
           var mock = mockrepository.partialmock<myabstractclass>();

           using ( mockrepository.record() )
           {
               expect.call( mock.dosomething( arg<string>.is.anything ) ).return( "hi..." ).repeat.once();
           }
           using ( mockrepository.playback() )
           {
               assert.areequal( "hi..." , mock.dosomething( "salam" ) );
           }
       }

答案 4 :(得分:-1)

我不会测试抽象类,因为一个非常简单的原因:实现类可能有自己的某些方法的实现 - 如果您测试抽象类,您将不知道进一步代码的实际行为。 此外,如果您测试抽象类的实现方法,那么您将测试与抽象类实现绑定 - 但您不能创建抽象类的对象,那么这种测试有什么用? :)