如何测试抽象类中定义的虚方法?

时间:2017-06-06 22:56:26

标签: c# unit-testing testing

我需要对抽象类中定义的虚方法进行单元测试。但是基类是抽象的,所以我无法创建它的实例。你建议我做什么?

这是对以下问题的跟进:I am thinking about if it is possible to test via an instance of a subclass of the abstract class. Is it a good way? How can I do it?

2 个答案:

答案 0 :(得分:3)

我不确定你的抽象类是什么样的,但如果你有类似的东西:

public abstract class SomeClass
{
    public abstract bool SomeMethod();

    public abstract int SomeOtherMethod();

    public virtual int MethodYouWantToTest()
    {
        // Method body
    }
}

然后,正如@David在评论中所说:

public class Test : SomeClass
{
    // You don't care about this method - this is just there to make it compile
    public override bool SomeMethod()
    {
        throw new NotImplementedException();
    }

    // You don't care about this method either
    public override int SomeOtherMethod()
    {
        throw new NotImplementedException();
    }

    // Do nothing to MethodYouWantToTest
}

然后,您只需为您的单元测试实例化Test

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        SomeClass test = new Test();
        // Insert whatever value you expect here
        Assert.AreEqual(10, test.MethodYouWantToTest());
    }
}

答案 1 :(得分:3)

没有规则说单元测试无法定义自己的类。这是一种相当普遍的做法(至少对我而言)。

考虑标准单元测试的结构:

public void TestMethod()
{
    // arrange
    // act
    // assert
}

“安排”步骤可以包括任何合理的操作(没有测试之外的副作用),这些操作设置了您要测试的内容。这可以很容易地包括创建一个类的实例,其唯一目的是运行测试。例如,像这样:

private class TestSubClass : YourAbstractBase { }

public void TestMethod()
{
    // arrange
    var testObj = new TestSubClass();

    // act
    var result = testObj.YourVirtualMethod();

    // assert
    Assert.AreEqual(123, result);
}