問題
我想在我的存盤庫類中對一個方法進行單元測驗,以檢查是否應該更新或創建新記錄。如何在沒有實際單元測驗嘗試插入或查詢資料庫的情況下測驗主要功能?
代碼
我有以下存盤庫類:
public class WidgetRepository()
{
public bool InsertOrUpdateWidget(Widget widgetToEval)
{
var retval = false;
var existingRecord = FindExistingWidget(widgetToEval);
if (existingRecord == null)
{
retval = InsertNewWidget(widgetToEval);
}
else
{
retval = UpdateExistingWidget(widgetToEval, existingRecord);
}
return retval;
}
單元測驗
[Fact]
public void Insert_New_Widget()
{
var repo = GetEmptyRepository();
var newWidget = new Widget()
{
ID = 1,
Name= "test",
Description= "Test widget",
};
var result = repo.InsertOrUpdateWidget(newWidget);
Assert.True(result);
}
private IWidgetRepository GetEmptyRepository()
{
var repo = new Mock<IWidgetRepository >();
repo.Setup(s => s.FindExistingWidget(It.IsAny<Widget>())).Returns((Widget)null);
repo.Setup(s => s.InsertNewWidget(It.IsAny<Widget>())).Returns(true);
return repo.Object;
}
在單元測驗中,我試圖模擬 FindExistingWidget 方法并讓它回傳一個空物件。我還模擬了插入函式并讓它回傳一個 true。當我運行這個測驗時,它不是回傳 true,而是回傳 false。
編輯 1
所以我明白我不應該模擬回購......我應該只創建一個這種型別的物件,因為我應該只模擬我的代碼需要/依賴的東西。但我想問題是我如何防止代碼在運行 FindExistingWidget() 方法或實際的 InsertNewWidget 方法時實際嘗試連接到資料庫?我只想對 InsertorUpdate 方法中的邏輯進行單元測驗,以確保它做正確的事情
uj5u.com熱心網友回復:
當您想測驗您的存盤庫時,您不需要測驗介面。當您想使用它來測驗某些東西時,您可以模擬您的存盤庫。這是“單元”測驗,因此您應該在將每種方法與其他方法分開的情況下對其進行測驗。
您應該測驗WidgetRepository而不是IWidgetRepository。
uj5u.com熱心網友回復:
如果您要模擬您的存盤庫,并且只想讓它回傳 true,那么請執行此操作;
private IWidgetRepository GetEmptyRepository()
{
var repo = new Mock<IWidgetRepository >();
repo.Setup(s => s.InsertOrUpdateWidget(It.IsAny<Widget>())).Returns(true);
return repo.Object;
}
您不能只模擬 WidgetRepository 類的一部分。在您上面使用的實體中是您的模擬,并且根據您上面的設定,您沒有實作您正在呼叫 ( InsertOrUpdateWidget)的函式repo.Setup。由于它回傳一個布林值,它將默認為 value false。此功能可能在您的具體實作中實作IWidgetRepository,但不在您的模擬中。return 陳述句return repo.Object;不是 of WidgetRepository,而是IWidgetRepository. 這是兩種不同的實作,其中只有一種實作InsertOrUpdateWidget。它不是你正在測驗的那個。
uj5u.com熱心網友回復:
正如前面的答案所述,您不是在模擬對 InsertOrUpdateWidget() 的呼叫,因此它回傳 false(它甚至沒有呼叫具體類中的代碼)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/532518.html
