2011-05-03 89 views
4

我有一個服務(AccountService),它有八種方法。其中一種方法發送電子郵件。我有另一個服務(EmailService),它是注入到AccountService中的構造函數。依賴注入ASP.NET MVC 3中的展覽和DependencyResolver?

我想知道是否有必要這樣做,因爲它感覺像每次我添加一個方法的依賴項的功能,我必須改變我嘲笑構造函數的依賴關係的所有測試。這感覺就像DI實際上讓事情變得更難,而不是更容易。

所以我想在我的控制器操作中使用DependencyResolver,它調用AccountService來獲取EmailService並將其傳入。但是,這會影響我的測試嗎?

我將如何去測試使用依賴解析器的控制器操作?鑑於帳戶服務是通過ninject注入到AccountController中的構造函數。

乾杯。

回答

5

不要在控制器中使用DependencyResolver!只需使用它來創建使用Ninject的控制器(請參閱https://github.com/ninject/ninject.web.mvc/wiki)。其他的一切都應該由Ninject使用構造函數注入來創建。實際上,使用適當的DI和符合SOLID原則的設計進行單元測試非常容易。

在測試夾具設置中,除了使用創建的mock作爲依賴關係爲每個依賴項和被測試對象的實例創建(動態)模擬外,別無其他。這樣你必須爲每個類的所有測試調用構造函數一次。

如果測試很難,那不是因爲DI,而是要麼不遵循SOLID原則(很可能是單一責任原則),要麼是因爲測試不好等原因。 Unittests使用真實的依賴性實例,而不是嘲笑或在測試夾具設置中做太多。

+0

你可能是正確的測試,我應該在我的測試裝置中設置字段作爲字段,以便我可以添加功能給他們?偶爾我會使用假貨,例如InMemoryRepository 而不是模擬>。這並不是說測試很難,只是因爲我傾向於嘗試使測試成爲原子,因此所有的設置都是相同的。我會檢查我的SRP服務並嘗試移動正在測試的類的初始化。謝謝你的提示。 – 2011-05-04 00:35:28

0

您是否考慮過使用Property DI或者是否需要將其注入到.ctor中? BTW:爲了測試你使用了一些Mocking Framework(例如Moq,RhinoMocks)嗎?

希望它能幫助你。

+1

應該避免屬性注入,除非依賴是可選的,並且服務可以在沒有它的情況下生存。 – 2011-05-03 21:20:22