[英]Unit testing with Moq and a Generic Repository
我正在用Moq創建我的第一個測試單元,但似乎無法使其正常工作。
我有一個通用存儲庫,可以注入我的ApplicationDbContext。 我正在嘗試接收數據庫中存儲的所有食物的列表。 在我的實際服務中,我使用了簡單注入器,並且在那里一切正常。
ApplicationDbContext:
public class ApplicationDbContext : IdentityDbContext<AppUser>
{
public ApplicationDbContext()
: base("ApplicationDbContext")
{
}
...
}
通用存儲庫:
public class Repository<T> : IRepository<T> where T : class
{
private ApplicationDbContext _context;
private readonly IDbSet<T> _entities;
public Repository(ApplicationDbContext context)
{
_context = context;
_entities = _context.Set<T>();
}
.. async methods .. (GetAllAsync)
}
最小起訂量:
[TestClass]
public class FoodServicesTest
{
private Mock<IRepository<Food>> _foodRepository;
[TestInitialize]
public void Initialize()
{
_foodRepository = new Mock<IRepository<Food>>();
}
[TestMethod]
public async Task CanGetAllFoods()
{
// Before edit 2
//IList<Food> foods = await _foodRepository.Object.GetAllAsync();
//_foodRepository.Setup(m => m.GetAllAsync()).ReturnsAsync(foods);
_foodRepository.Setup(m => m.GetAllAsync()).ReturnsAsync(List<Food>());
IList<Food> foods = await _foodRepository.Object.GetAllAsync();
Assert.IsTrue(foods.Count >= 1);
}
}
編輯2:
將安裝程序放置在GetAllAsync()上方(感謝Patrick Quirk)並將其參數替換為“ new List()”之后,食物列表不再返回null,而是返回0,這可能更好,但我希望它是2 (例如服務中)。
返回值是一個空列表。 這是由您的代碼這一行指定的
_foodRepository.Setup(m => m.GetAllAsync()).ReturnsAsync(new List<Food>());
上面的指令實際上是在調用GetAllAsync時告訴模擬對象返回一個新的空列表。
您應該改為創建新的Food對象,以“模擬”數據庫中的結果,如下所示:
var foodList = new List<Food>();
foodList.Add(new Food() { ...insert your mocked values here });
foodList.Add(new Food() { ...insert your mocked values here });
_foodRepository.Setup(m => m.GetAllAsync()).ReturnsAsync(foodList);
編輯
在代碼上看起來更好,我只能看到您只是在使用模擬對象,並查看是否返回結果。 您確定此測試確實需要嗎? 當涉及要測試的某些業務邏輯時,在存儲庫上使用模擬對象很有用。 也許您的代碼只是為了提出問題而被重寫,但值得指出。
您可以指定值以這種方式返回:
var foods=new List<Food>();
//// add two items here
foods.Add(new food(){.. set values });
foods.Add(new food(){.. set values });
_foodRepository.Setup(m => m.GetAllAsync()).ReturnsAsync(foods);
IList<Food> foods = await _foodRepository.Object.GetAllAsync();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.