我正在使用最小起订量创建我的第一个测试单元,但似乎无法使其工作。
我有一个注入我的 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);
编辑
更好地查看代码 我只能看到您只是在使用 mock 对象并查看是否返回结果。 你确定真的需要这个测试吗? 当涉及一些要测试的业务逻辑时,在存储库上使用模拟对象很有用。 也许你的代码只是为了提出问题而被重写的,但值得指出这一点。
您可以指定要以这种方式返回的值:
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();