我一直在關注本教程并嘗試了解此 Xunit 更新服務測驗。
服務如下:
public async Task<Category> Update(Category category)
{
if (_categoryRepository.Search(c => c.Name == category.Name && c.Id != category.Id).Result.Any())
return null;
await _categoryRepository.Update(category);
return category;
}
和 Xunit 測驗:
[Fact]
public async void Update_ShouldNotUpdateCategory_WhenCategoryDoesNotExist()
{
var category = new Category()
{
Id = 1,
Name = "Test Category 1"
};
var categoryList = new List<Category>()
{
new Category()
{
Id = 2,
Name = "Test Category 2"
}
};
_categoryRepositoryMock.Setup(c => c.Search(c => c.Name == category.Name && c.Id != category.Id))
.ReturnsAsync(categoryList);
var result = await _categoryService.Update(category);
Assert.Null(result);
}
我知道從這個作者關于測驗應該做什么的注釋與方法名稱的何時條件相矛盾(它大約是鏈接教程頁面的 3/4):
- 當更新的類別名稱已存在時,該方法不會更新類別。
測驗回傳 null,但我不確定它是否出于正確的原因這樣做。
是不是在模擬回購中找不到類別?當我嘗試添加一個類別時,希望它會找到該類別并通過測驗,但它仍然回傳為空:
new Category()
{
Id = 1,
Name = "Test Category One"
}
或者是回傳categoryListing的驗證的模擬,即使它不是正確的記錄(因為它的名稱不匹配)足以導致null?(我猜是這個)
我是單元測驗的新手,但感覺不是一個好的測驗,不應該在模擬存盤庫中預加載記錄,然后更新的記錄對其進行驗證測驗?我猜這只是另一種方法,但是,我將如何更改代碼來實作這一點?
uj5u.com熱心網友回復:
測驗回傳 null,但我不確定它是否出于正確的原因這樣做。
你是完全正確的 - 服務不檢查類別的存在并且測驗通過只是因為模擬設定為模仿行為“存在另一個具有相同名稱的類別”。
我是單元測驗的新手,但感覺不是一個好的測驗不應該模擬存盤庫預加載記錄,然后更新的記錄對其進行驗證測驗
它是其中一種方法——它是偏好/最佳實踐的問題,以及如何拆分和測驗。我會說提供的代碼在很多方面都很糟糕:
- 通過異步方法呼叫
Task.Result(inCategoryService.Update) 被認為是一種不好的做法(閱讀更多 #1,閱讀更多 #2):
if (_categoryRepository.Search(c => c.Name == category.Name && c.Id != category.Id).Result.Any())
return null;
一般來說,EF 上的存盤庫模式可以被認為是反模式(但是有很多人不同意這一點),但是即使你使用它,
Update方法的實作仍然是非常值得懷疑的依靠回報的合同
null似乎也很值得商榷。
我猜這只是另一種方法,但是,我將如何更改代碼來實作這一點?
首先,您需要更改Update方法以檢查記錄是否存在。例如通過添加下一行:
if (!(await _categoryRepository.Search(c => c.Id == category.Id)).Any())
return null;
(盡管我會將這兩個Search呼叫結合起來_categoryRepository.Search(c => c.Name == category.Name || c.Id != category.Id)并檢查搜索結果的計數和是否存在具有相應 ID 的記錄)
然后通過添加額外的Setup呼叫來更新測驗(其他測驗也可能需要Setup更新):
_categoryRepositoryMock.Setup(c => c.Search(c => c.Id == category.Id))
.ReturnsAsync(new List<Category> { });
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/488722.html
上一篇:如何在Koltin協程測驗中以false模擬isActive值?
下一篇:Mockito期望引數不匹配
