2014-03-28 155 views
9

我可以指示AutoFixture還填寫私人財產,其中註明了所有類的特定屬性,例如Ninject.Inject?源似乎只掃描公共屬性:1。這個問題提供了一個專用MyClass與私人setter,但不是私人財產或所有類的解決方案:2AutoFixture和私人財產

我使用Moq來模擬服務,最後我想用這些模擬來填充屬性。如果我公開MyService依賴關係爲public,以下設置工作正常。

一些示例代碼:

public class MyController { 
    [Inject] 
    private IMyService MyService { get; set; } 

    public void AMethodUsingMyService() { 
     MyService.DoSomething(); 
     // ... 
    } 

    // ... 
} 

public class MyService : IMyService { 
    public void DoSomething() 
    { 
     // ... 
    } 

    // ... 
} 

public class MyControllerTest { 
    [Theory] 
    [AutoMoqData] 
    public void MyTest(MyController controller) { 
     controller.AMethodUsingMyService(); 
    } 
} 
+0

NB Ninject 2或更高版本不支持注入'私人'(它不應該包含在'馬克的答案中)。真的不這樣做 –

+0

我使用的版本是3.0.1.10,只要你指示Ninject注入它們('InjectNonPublic'),注入'private's就可以正常工作。我同意馬克的回答! – Jani

+0

該死的曾經以爲這個選項也在V2 reimpl中死了,但我立場糾正。這意味着這些文檔是錯誤的(它說,在我上次查看並在兩年前使事情保持一致時,許多地方的V2注入了私有化)。可悲的是,我無法激勵自己在wiki中解決這些問題 - 希望其他人能夠解決這些問題。 –

回答

9

AutoFixture不具有內置支持非公共字段或屬性分配值。這是設計。

AutoFixture是單元測試的實用程序庫,SUT的單元測試shouldn't directly invoke private members

AutoFixture最初是作爲測試驅動開發(TDD)的工具構建的,而TDD則是關於反饋的。本着GOOS的精神,您應該聽取您的測試。如果測試很難寫,你應該考慮你的API設計。 AutoFixture往往會放大這種反饋,所以我的第一反應是挑戰想要這樣做的動機。

由於您正在引用NInject,因此看起來好像您正在使用依賴注入(DI)。但是,具有私人物業注入的DI聽起來異乎尋常。考慮使屬性公開或更好地使用構造器注入而不是屬性注入。

這將使AutoFixture能夠像Auto-Mocking Container一樣自動工作。

然而,AutoFixture是一個非常可擴展庫,所以如果你真的必須做到這一點,應該可以寫,可以寫私人屬性的擴展,但它不會是有史以來最簡單的AutoFixture擴展。

+0

感謝您的鼓舞人心的評論!我確實使用DI和AutoFixture和Moq作爲自動嘲諷容器。我爲我的類使用屬性注入,因爲構造函數注入看起來像我的樣板。我還使用私有屬性來防止來自外部的修改,以防止任何可能的錯誤。只要(DI +測試)工具能夠設置私有字段,就可以正常工作:)我想,我應該學會使用樣板文件,並且更喜歡構造器注入來正確地執行內容,因爲無論如何都應該管理依賴關係。非常感謝AutoFixture! – Jani

+0

我不確定我是否明白爲什麼構造函數比屬性的樣板更多...無論如何,如果您有依賴關係,您應該[更喜歡構造函數注入](http://blog.ploeh.dk/2011/05/30/DesignSmellDefaultConstructor)。有關更多詳細信息,請閱讀[我的書](http://affiliate.manning.com/idevaffiliate.php?id=1150_236):) –

+0

註釋字段比在構造函數中接收字段更容易,然後將其分配給一個領域。當然,添加過多的字段注入相關性非常容易,但IDE會警告您。另外,說實話,我已經長大了與田間注射,這似乎是我的一個壞習慣。獲得的教訓,更喜歡構造函數注入。謝謝你教育我!哦,我一定要閱讀一些.NET書籍,因爲這是我的第一個.NET項目! – Jani