我正在为我的服务层编写单元测试,我完全明白创建单元测试来验证逻辑的意义所在。例如,如果我创建一个将两个数字相加的函数,请务必为此编写一个单元测试。
但是如果在我的服务层方法中我有这样的东西
public ICollection<MyEntity> GetAll()
{
return _context.MyEntities
.Where(e => !e.IsDeleted)
.ToList();
}
单元测试的意义何在?由于我是从数据库中获取的,因此模拟数据库似乎很愚蠢,因为我只是假设 Linq 正常工作?
针对其中包含相同数据的实际“测试”数据库进行测试不是更好吗?这样我就可以看到从数据库中检索到的记录数是否符合我的预期?
我知道针对数据库进行测试更像是一种集成测试,但它对单元测试真的有效吗?
如果我再举一个例子,这样说呢
public int Delete(long id)
{
_context.Database.ExecuteCommand("DELETE FROM myTable WHERE Id = ?", id);
return _context.SaveChanges();
}
如何对这个函数进行单元测试?如果我模拟 _context.Database 并创建一个单元测试来检查是否正在调用 _context.SaveChanges(我认为这毫无意义),则无法保证它实际上会删除我的数据。如果我有外键约束怎么办?模拟会通过,但实际方法真的会失败吗?
我刚刚开始思考,除非一个方法实际计算某种逻辑,否则我看不到创建单元测试的意义/原因,尤其是在使用 Entity 框架时?
最佳答案
我认为对几乎所有类型的函数进行单元测试是有意义的:
“对这个进行单元测试有什么意义?因为我是从数据库中获取这个的,所以模拟数据库似乎很愚蠢,因为我只是假设 Linq 正常工作?”
- 您不是在测试 Linq,而是在测试函数;该函数的名称为
GetAllAsync
;并且我可以简单地假设这将返回存储在数据库中的所有MyEntity
实例。但它只返回已删除的项目;单元测试不仅仅是验证功能是否正常工作;这也是一种检查此函数是否正确命名的方法。 这个函数也有问题;如果
_context.MyEntities(e => !e.IsDeleted) 返回空值?
ToList
将抛出异常。然后,如果您测试极值,单元测试将有助于识别潜在问题。此外,单元测试会强制您使用抽象。如果您不能对方法进行单元测试,则该方法可能有问题,您需要调查该方法并重构。
_context.Database.ExecuteCommand(“从 myTable 中删除,其中 Id =?”,id);在我看来,这行代码需要留在其他地方,而不是在服务层(也许在存储库中?)。如果 id 是“-1”怎么办?你将如何处理异常?
我认为很难针对不包含 Linq
的单元测试方法制定通用规则。
关于c# - 任何使用 EF 或 Linq 的单点单元测试方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31111157/