簡體   English   中英

C# 單元測試 - 您是否應該對基類中處理的派生類中的某些內容進行單元測試?

[英]C# Unit Testing - Should you unit test something in a derived class that is taken care of in a base class?

public class Foo<T>
{
    public Foo(Bar bar)
    {
        if (bar == null) throw new ArgumentNullException("bar");
    }
}

public class Foo : Foo<Object>
{
    public Foo(Bar bar) : base(bar) { }
}

基本上,我明白我應該對通用 Foo 的構造函數進行單元測試。 我還應該對非通用版本的構造函數進行單元測試嗎? 我問的原因是因為異常是在通用構造函數級別拋出的......

[TestMethod]
[ExpectedExeption(typeof(ArgumentNullException))]
public void GenericFooNullArgumentInConstructor()
{
    var foo = new Foo<int>(null);
}

//Is this test necessary?
[TestMethod]
[ExpectedExeption(typeof(ArgumentNullException))]
public void NonGenericFooNullArgumentInConstructor()
{
    var foo = new Foo(null);
}

是的。 無需查看所有實現,這是驗證派生類是否維護基類保證的最簡單方法。 尤其是當實習生 Bob 稍后進來並修改您的派生類以做其他事情時。

一句話:是的。
這里的關鍵是回歸——您將編寫單元測試來驗證您當前的實現(如果您是 TDD,甚至在實現之前),但您還要編寫單元測試以保護自己免受將來對代碼的破壞性更改。
由於基類和子類都可能在未來更改 - 都應該進行測試。

這取決於...

你為什么要編寫單元測試?

1) 測試您將要編寫的代碼

2)測試你已經寫好的代碼

3) 測試某人將來可能編寫的代碼

如果您正在編寫代碼來測試您將要編寫的內容,請根據您將要編寫的代碼的要求編寫代碼。

如果您正在編寫測試來測試您的代碼,請測試您編寫的代碼。

如果您編寫測試以防止其他人更改您的代碼,那不是您的責任。

例子

您有一個帶有特定方法 M 的基類 A。您已經對這個方法進行了反向、橫向和顛倒測試。 然后創建 A 的 3 個子類,並將它們稱為 B、C 和 D。為類 B 和 C 添加新的功能內部方法。

您應該測試 B 類和 C 類的新方法,因為此代碼未經測試,但 A 類中的方法 M 已經過測試。

您在類 D 中覆蓋方法 M,添加代碼,然后調用基方法 M。應該測試新的覆蓋方法,並且必須將其視為全新的方法。 單元測試無法確認基類的 M 方法已被調用。

編寫相同的測試 4 次對任何人都沒有任何好處。 每個開發人員都應該為他們編寫的代碼重寫測試。 如果該代碼經過測試,並且測試滿足要求,並且測試通過,則代碼是好的。

連續三次參加同樣的考試是沒有意義的。

另一方面

我們並不生活在一個完美的世界中,如果您對其他開發人員測試他們自己的代碼有疑問,那么您可能會發現為他們完成工作很有用。 但是要意識到,測試他們編寫的代碼不是你的工作,那是他們的工作。

超級晚更新...

您還應該測試將直接受您正在編寫的新代碼影響的方法。 例如,如果您更改方法 A,但方法 A依賴於方法 B,並且您覆蓋了方法 B,則應考慮在派生類中測試方法 A,因為方法 A 的功能可能由於其依賴而發生了變化在方法 B 上。

您也應該為派生類編寫單元測試! 單元測試可確保您測試的類按預期工作。 這讓您有機會在某一天重構它。 如果你在重構派生類的構造函數時犯了一個錯誤——沒有單元測試會發現那個錯誤。 (如果您還沒有為派生類編寫單元測試)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM