2016-08-01 26 views
2

我正在使用AutoFixture[AutoData]屬性來提供一些單元測試(NUnit)與一個POCO實例。例如:如何將基於約定的自定義與AutoFixture的[AutoData]屬性結合起來?

[Test, AutoData] 
public void Create_NameIsNull_ThrowsException(MyPOCO myPOCO) {..} 

我最近增加了一個新的字符串屬性,以我的POCO必須始終包含正確格式的URL。

當然,[AutoData]不知道這一要求,併爲此屬性生成通常的基於GUID的字符串值。這會導致我的測試失敗(因爲我有一些基於Data Annotations的驗證)。

我遵循@ ploeh的建議,併爲AutoFixture編寫Convention-based Customization,專門爲我的這個新屬性生成格式正確的URL字符串。這是一個名爲UrlSpecimenBuilder的類,它實現了ISpecimenProvider

我的問題是,我怎樣才能將我的新ISpecimenProvider[AutoData]

我不想在每個單元測試中都去fixture.Customizations.Add(new UrlSpecimenBuilder());。我正在尋找一個能夠做同樣事情的單個測試夾具設置步驟。

+2

正如我在[Twitter對話](https://twitter.com/urig/status/760085204971163649)中提到的那樣,適當的反應是將屬性的類型從'string'更改爲'Uri',從而避免[原始癡迷](http://blog.ploeh.dk/2011/05/25/DesignSmellPrimitiveObsession)。在那次談話中,你也暗示這不適用於這種情況,但由於這對於這篇文章的臨時讀者來說並不明顯,我已經添加了這個評論。 –

回答

4

您應該定義自己的AutoDataAttribute版本並應用所需的所有自定義設置。如果自定義相關的所有測試中,它可能被稱爲DefaultAutoData

[Test, DefaultAutoData] 
public void Create_NameIsNull_ThrowsException(MyPOCO myPOCO) {..} 

internal class DefaultAutoDataAttribute : AutoDataAttribute 
{ 
    public DefaultAutoDataAttribute() 
    : base(new Fixture().Customizations.Add(new UrlSpecimenBuilder())) 
    { 
    } 
} 

詳見this Mark Seemann post

相關問題