2011-08-23 77 views
1

我有一個只有簡單屬性的DTO。有沒有與此方法相匹配的設計模式?

我想就DTO情況下,一些測試假設,如:IsOld,IsFromBataFamily等

我想延長DTO類和執行這些測試方法。

public class TestableDTO : DTO 
{ 

    public bool IsOld() { // some logic } 
    public bool IsFromBataFamily() { // some logic } 

} 

是否有任何設計圖案,這種方法(擴展一個DTO類添加一些關於它的測試人員的類別進行分類)相匹配?

請問您能說出來嗎?

+4

的「我使用的方法」的格局? –

+0

在你的地方,我寧願編寫單元測試,通過使用你的類的實例來檢查這些屬性,而不是擴展它。我覺得測試應該擴展這個類,以便在他們打算檢查提供給子類的接口時才進行測試。 –

+0

@clement - 這只是一種簡單的觀察。這個課程是從中派生出來的。他不只是使用方法。 –

回答

1

這只是普通的繼承,不知道它是否有與之相關的模式。如果您的TestableDTO在內部持有一個DTO引用,目的是爲其添加成員,那將是裝飾者模式,或者至少是其中的一種風格。

public class TestableDTO 
{ 
    private DTO _dto; 

    public bool IsOld() { // some logic } 
    public bool IsFromBataFamily() { // some logic } 

    // Expose DTO public members again... 
} 

所以,簡單的答案是否定的,目前這不是一個「設計模式」本身,而是類的繼承,或擴展的面向對象的範例。

只是爲了澄清,你已經做了什麼來增加成員的類是完全正確的。然而,它的原因(僅用於測試)可能被認爲有點奇怪,因爲您應該能夠直接測試DTO

0

這與裝飾者模式類似,但並不完全。我能想到的最接近的東西就是繼承或專業化的擴展。

Roy Osherove描述了一種稱爲Extract和Override的方法,您可以在他的書「單元測試藝術」(我極力推薦)中閱讀這些方法。 online sample chapter描述了這一點。

這應該給出一些更好的想法,以便如何使用繼承來使對象更易於測試。

0

如果您想爲單元測試目的擴展特定的DTO,最簡單和最簡潔的方法是實現擴展方法 - 例如,

public static Class DtoExtensionMethods { 
public static bool IsTooOld(this SomeSpecificDto specificDto) 
{ 
    return specificDto.LastModified < DateTime.Now - TimeSpan.FromHours(2) ; 
}} 
0

這並不回答你的問題,但不會是以下更好的方法?

[Flags] 
public enum TestDTOFlags 
{ 
    None = 0, 
    Old = 1, 
    FromBataFamily = 2 
} 

public class TestableDTO : DTO 
{ 
    public TestDTOFlags DetermineFlags() { /* some logic */ } 
} 

要進一步從業務邏輯中分離出來這一點,也許這可能是你的測試套件的擴展方法:

public static class DTOExtensions 
{ 
    public static TestDTOFlags DetermineFlags(this DTO target) { /* some logic */ } 
} 
相關問題