2016-01-22 52 views
1

我是TDD的新手,我使用了一堆XUnit,AutoFixture和Moq。我想知道moq的目的是什麼時候測試一個函數調用一個存儲庫來訪問數據庫。如果IRepository調用不返回值,則使用Moq來解決測試依賴關係的目的

例如:
我有一個簡單的項目結構,其中我的BLL引用我的DAL。在我的正常應用程序中,IRepository被注入到ProductBLL.cs中。所以我看到Moq幫助我在我的測試中注入了相同的存儲庫。 (但什麼是點,如果該打數據庫中的功能不起作用?)

我的問題:
比方說,我正在測試來測試我的業務層,我想測試調用函數我在我的實際代碼中調用我的數據庫的存儲庫。如果使用Moq並且沒有返回數據,可以測試這樣的函數嗎?在下面的例子中,sut.GetProducts()不會返回任何結果,而且在我的實際代碼中它會觸發數據庫並返回一些內容。

可以說我有一個簡單的測試,與起訂量做到這一點:

[Fact] 
    public void TestGetProducts_Manual_Moq() 
    { 
     // Arrange 
     var mockCustomerRepository = new Mock<IProductRepository>(); 

     var sut = new ProductBLL(mockProductRepository.Object); 

     // Act 
     var result = sut.GetProducts(); 

     // Assert 
     Assert.True(result.Count > 0); 
    } 

下面是一個簡單的測試使用AutoFixture與起訂量結合發揮到淋漓盡致:(我想在這個例子中AutoFixture至少會返回3行假數據)

[Fact] 
    public void TestGetProducts_AutoMoq() 
    { 
     // Arrange 
     Fixture fixture = new Fixture(); 

     // Add auto mocking support for Moq 
     fixture.Customize(new AutoMoqCustomization()); 

     var sut = fixture.Create<ProductBLL>(); 

     // Act 
     var result = sut.GetProducts(); 

     // Assert 
     Assert.True(result.Count > 0); 
    } 

回答

3

如果GetProducts只需調用的存儲庫,也只能自認倒黴結果可能是值得商榷的,如果值得對它進行測試。但是,一般GetProducts可能會做很多其他事情,例如:過濾,分組,更改格式和其他許多事情。

在這種情況下,您可以驗證的不僅僅是檢查GetProducts是否返回一些結果。例如,我們假設存儲庫返回類型爲A的對象,但GetProducts返回B類型的對象。這意味着數據必須從A類型的對象複製到B類型的對象。在這種情況下,可以刪除一些數據,重新格式化等。您的測試應驗證最終結果是否正確。

其次,GetProducts可以使用存儲庫的1,2或更多種方法。其中一些方法可能只能使用一次或多次。按照正確的順序

    • 的時間正確的量
    • 與參數

    Thisthis正確的值:如果是這樣,你可以使用一個模擬來驗證,如果使用方法問題是關於在Moq中驗證方法調用的正確順序。 This問題是關於在Moq中驗證多個呼叫。我也強烈建議閱讀this教程。

  • +0

    我明白在測試一個只是進行簡單的數據庫調用的函數中沒有意義。但讓我們說我有一個非常複雜的業務功能,有幾次調用存儲庫。如果存儲庫永遠不會返回任何東西,測試如何工作?所以根據你的說法,你不會測試一個返回數據的函數。但是,測試一個可以在其中進行數據調用的函數是可行的嗎? –

    +0

    假對象不僅用於模仿真實對象(在這種情況下,它們被稱爲存根),而且還用於驗證方法是否正確使用(在這種情況下,它們稱爲模擬)。換句話說,你應該使用由Moq創建的模擬對象來驗證你需要什麼。 –

    +0

    因此,通常我不會在BLL中測試一個檢索數據並執行某些操作的函數。我將在BLL中測試一個將數據作爲參數的函數,以便我可以使用AutoFixture創建虛擬數據。這有意義嗎? –