2

我必須測試在MyMobileApp.MyService.Module中實現的IoC服務。我應該如何正確測試IoC服務?

在我的單元測試項目MyMobileApp.MyService.Module.Tests對IOC模塊MyMobileApp.MyService.Module引用的那一刻

CFTestRunner用於調試和Visual Studio的測試運行,也可用於與運行測試輸出到GUI窗口(???)

IMHO這種架構也有缺點:

  • 服務必須在[TestInitialize]手動初始化:

try { var module = new Module(); // Drawback: what if 2 services should be used? module.AddServices(); } catch (Exception) // Services must be added only once { // In TestInitialize // ClassInitilaize method is not executed if unit test is running under CFTestRunner??? }

this.myService = RootWorkItem.Services.Get();

  • 測試另一個服務實現我應該改變參考,並重新編譯測試項目

所以我有一些改進的想法:

  • 是不是很好用可測試版ProfileCatalog允許IoC容器自動添加測試服務?這個ProfileCatalog如何正確部署在devcie/emulator上?

  • 在測試類中使用注入服務是否好(如果可能的話)?

而且在那裏我能找到的樣本代碼/項目(S)具有良好的測試模式/文章 - 我的意思是測試的IoC服務

+0

你看過Moock這樣的Mocking框架嗎? –

+0

.NET CF不支持生成代理所需的Reflection.Emit .. – hellboy

+0

如何將它們自己剔除?你的問題似乎與將測試中的實際代碼注入依賴關係有關......在單元測試中你不應該這樣做,因爲它們會導致測試需要很長時間才能執行。這更多的是在構建時進行的集成測試。 –

回答

1

通常I接口的所有服務。這允許在ServicesCollection中創建和注入模擬服務。我的測試項目通常會包含幾個接口的實現,允許我使用適合給定測試的任何一個。然後在TestInitialize或TestClass構造函數中創建一個注入適當的項目。你的模塊應該通過接口提取依賴項服務,所以它會在你想要的時候得到你的測試實例。

如果您查看CFTestRunner的源代碼,您可以看到除TestMethod和TestInitialize屬性之外,我沒有做很多輔助支持。如果你需要的話,你當然可以擴展它,但是它很薄的原因是因爲我從來沒有真正需要其他東西。

您無法真正測試直接模塊加載,因爲CFTestRunner不是SmartClientApplication,所以IModuleInfoStore永遠不會被加載。我想你可以創建一個衍生的CFTestRunner,它是一個SmartClientApplication,它可以讓你爲你的TestClass創建一個屬性,讓你返回一個IModuleInfoStore