如何为依赖于其他服务或数据库的服务编写单元测试

How to write unit test for service having dependency on other service or database

抱歉,如果我问的是非常基本的问题,

我有一套网络服务(使用 .Net WebApi 开发)。这些服务要么是业务层,要么是数据访问层API。这些 API 依赖于其他服务或数据库本身。

我想为它编写单元测试用例。我有以下问题

  1. 作为业务层 APIs 依赖于数据访问服务或其他一些服务。如果我编写单元测试只是为了调用业务 API,那么它将调用数据访问 API。这是编写单元测试用例的正确方法吗?或者我应该用单元测试注入所有依赖对象?我认为更早的一个是集成测试而不是单元测试。

  2. 我是否应该为数据访问层编写单元测试?我检查了这个 link (Writing tests for data access code: Unit tests are waste),它说 DAL 不需要单元测试。我还应该为数据访问层编写测试吗?我认为这是集成测试而不是单元测试?

问题 1:

我会说如果你想做 TDD,那么它不是 "correct" 方式,因为正如你所说,你将执行集成测试。话又说回来,也许你 不想 想做 TDD,集成测试对你来说已经足够好了,但要回答这个问题:这不是 **unit- 的正确方法**测试你的代码。


问题 2

我会说这取决于您在数据访问层中拥有的内容。例如,如果您实施存储库,您可能想要编写一些测试。

保存方法

您要确保给定一个您从存储库中检索到的实体,编辑该实体的某些属性并保留更改将实际保存修改,而不是创建新实体。现在:你可能认为这是一个集成测试,但它实际上取决于你的代码设计得有多好。例如,您的存储库可能只是低级 ORM 之上的额外逻辑层。在这种情况下,在测试保存方法时,您要做的是断言在注入到存储库中的 ORM 服务上使用正确的参数调用了正确的方法。

错误和异常

访问数据时,可能会出现数据库连接断开、数据格式不符合预期、反序列化等问题。如果您想提供一些良好的错误处理并可能创建自定义异常并根据上下文向它们添加更多信息,那么您肯定想编写测试以确保传播正确的信息

另一方面

如果您的 DAL 只是几个 类 包装了一个不可模拟的 ORM,并且您在其中没有任何逻辑,那么也许您不需要测试,但看起来这不会经常发生,你几乎总是会有一些可能出错的逻辑,你想要测试。