我是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);
}
我明白在測試一個只是進行簡單的數據庫調用的函數中沒有意義。但讓我們說我有一個非常複雜的業務功能,有幾次調用存儲庫。如果存儲庫永遠不會返回任何東西,測試如何工作?所以根據你的說法,你不會測試一個返回數據的函數。但是,測試一個可以在其中進行數據調用的函數是可行的嗎? –
假對象不僅用於模仿真實對象(在這種情況下,它們被稱爲存根),而且還用於驗證方法是否正確使用(在這種情況下,它們稱爲模擬)。換句話說,你應該使用由Moq創建的模擬對象來驗證你需要什麼。 –
因此,通常我不會在BLL中測試一個檢索數據並執行某些操作的函數。我將在BLL中測試一個將數據作爲參數的函數,以便我可以使用AutoFixture創建虛擬數據。這有意義嗎? –