0

我有一個單元測試項目,它使用Ninject模擬數據庫存儲庫。我想使用與集成測試相同的測試,並使用Ninject將我的真實數據庫存儲庫綁定回各自的實現中,以便將應用程序測試/壓入​​數據庫。使用IOC配置單元和集成測試

有沒有辦法用Visual Studio 2012做到這一點,或者是否有另一個測試框架,而不是MSTest,它允許這種類型的配置?

我真的很討厭將這些單元測試重寫/複製到集成測試項目中,但我懷疑我可以將這些文件作爲鏈接複製並將單個測試文件編譯爲兩個項目(單元和集成)。

感謝 託德

回答

1

您的要求聽起來太奇怪了吧。單元測試和集成測試之間的差異比僅僅連接到數據庫要大得多。集成測試要麼具有更大的範圍,要麼測試組件是否正確通信。當你編寫一個單元測試時,這樣一個單元的範圍通常很小(一個類/組件具有所有依賴關係被模擬出來),這意味着不需要使用DI容器。

讓我說得有所不同。當測試完全相同時,爲什麼你有興趣在有和沒有數據庫的情況下進行相同的測試。只需保留數據庫並對其進行測試即可。除了這些測試外,您還可以添加具有更小範圍的「真實」單元測試。

+0

假設我有一個實現了IService的服務,它依賴於由SqlServiceRepository實現的IServiceRepository並且它碰到了一個SQL DB。我想運行以IService爲目標的單元測試,因此我創建了一個實現IServiceRepository的MockServiceRepository,並使用DI爲僅使用內存集合的Mock存儲庫轉換SQL存儲庫。這完美地在本地運行,並在我的構建服務器上運行。現在我想使用相同的單元測試來測試SqlRepository,而不是使用Mock Repository,我想使用SQL Repository。 –

+0

您正試圖重複使用相同的測試來測試完全不同的內容。編寫一個不同的測試來單獨測試SqlRepository。通過這種方式,測試更加專注,更加值得信賴。 – Steven

+0

一致認爲,將工作,但然後我沒有得到結束測試,這是我所說的集成測試。 –

0

隨着NUnit的你可以用TestCase的做到這一點,

說,你需要使用的單元,採用CustomerRepository和OrderRepository單元/集成測試,

[TestFixture] 
public class TestCustomerRepository 
{ 
    IKernel _unit; 
    Ikernel _integration; 

    [SetUp] 
    public void Setup() 
    { 
     //setup both kernels 
    } 

    [TestCase("Unit")] 
    [TestCase("Integration")] 
    public void DoTest(String type) 
    { 
     var custRepo = GetRepo<ICustomerRepository>(type); 
     var orderRepo = GetRepo<IOrderRepository>(type); 
     //do the test here 
    } 

    protected T GetRepo<T>(String type) 
    { 
     if (type.Equals("Unit")) 
     { 
      return _unit.Get<T>(); 
     } 
     return _integration.Get<T>(); 
    } 
} 

這是基本的想法。