2017-06-06 68 views
-1

我需要單元測試在一個抽象類定義的虛擬方法。但是基類是抽象的,所以我不能創建它的一個實例。你推薦我做什麼?如何測試在一個抽象類定義的虛擬方法?

這是一個後續行動以下問題: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

您的測試本身可以有一個從抽象類繼承的測試類。然後測試可以實例化一個實例並測試功能。這更像是一個「安排」步驟,但仍然是我認爲有效的一步。 – David

+0

我與@大衛同意在這裏。 – EJoshuaS

回答

3

我不知道你的抽象類是什麼樣子,但如果你有這樣的:

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

    public abstract int SomeOtherMethod(); 

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

然後,當@大衛建議的意見:

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

謝謝。在測試類中調用MethodYouWantToTest? – Tim

+0

@Tim我包括這方面的一個例子 - 你可以實例化'Test'並使用它就像你正在使用抽象類(這就是爲什麼你不希望重寫'MethodYouWantToTest'在'Test'類 - 這樣你知道你正在運行基類中的代碼)。 – EJoshuaS

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