c# - 任何使用 EF 或 Linq 的单点单元测试方法?

标签 c# .net entity-framework unit-testing testing

我正在为我的服务层编写单元测试,我完全明白创建单元测试来验证逻辑的意义所在。例如,如果我创建一个将两个数字相加的函数,请务必为此编写一个单元测试。

但是如果在我的服务层方法中我有这样的东西

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/

相关文章:

c# - 部分声明不得指定不同的基类

c# - 如何将文本从多个文本框中的文件中的行插入到文本框中?

c# - Entity Framework 和工厂模式

c# - 主要方法中的变量是静态的吗

.net - 绕过成员名称不能与其封闭类型相同

c# - 使用最小起订量的同步方法测试 EF 异步方法

c# - 获取程序集路径 C#

c# - Windows 应用程序的动画

c# - 使用两个条件在 Entity Framework 中指定项目列表内容

c# - Entity Framework 小数舍入与投影不一致