单元测试在什么时候成为集成测试?

时间:2016-06-16 21:48:39

标签: unit-testing integration-testing

单元测试涉及测试应用程序的最小单元。因此,可以针对UserRepository编写单元测试以测试GetAllUsers()方法。

也可以针对UserDomain编写单元测试以测试GetAllUsers()方法。由于UserDomain调用UserRepository,UserDomain测试会被视为集成测试吗?

如果有一个服务层将API提供给后端,那么UserDomain测试会被视为单元测试吗?

1 个答案:

答案 0 :(得分:0)

如果您正在测试依赖于UserDomain的{​​{1}},那么您不会对接口进行编码,而是对某个具体/实施进行编码。这又将两者结合在一起。耦合代码意味着难以对单元测试代码进行测试,因为没有UserRepository没有UserDomain的测试。

在您的示例中,您可能会遇到以下情况:

UserRepository

这种方法编码的问题是你不能真正地进行单元测试" public class UserDomain { public object GetAllUsers() { UserRepository repo = new UserRepository(); var results = repo.GetAllUsers(); // do some stuff like transforming it return null; } } public class UserRepository { public object GetAllUsers() { return null; // implementation } } ,因为它依赖于UserDomain。为了完成真正的单元测试,你的作品必须不依赖于实现,而是依赖于接口等抽象。

要完成单元测试,您的类看起来更像:

UserRepository

注意一旦你理解了你所看到的内容,这里并没有真正改变。我们创建了一个public class UserDomain { private readonly IUserRepository _iUserRepository; public UserDomain(IUserRepository iUserRepository) { _iUserRepository = iUserRepository; } public object GetAllUsers() { var results = _iUserRepository.GetAllUsers(); // do some stuff like transforming it return null; } } public interface IUserRepository { object GetAllUsers(); } public class UserRepository : IUserRepository { public object GetAllUsers() { return null; } } 现在实现的新接口IUserRepositoryUserRepository也已更新,而不是新建一个特定的实施(UserDomain),接受UserRepository的实例。

这意味着一些事情,IUserRepository不再直接依赖于UserDomain,它现在依赖于抽象UserRepository,它可以很容易地被模拟,存根或伪造成为了测试目的而提供测试功能。

在构造函数中传递接口实现的概念称为dependency injection。构造函数注入是完成依赖注入的一种方法,但也有其他方法。它的基本思想是,如果一个类具有依赖关系,那些依赖关系应该在接口/契约上,而不是文字实现。

综上所述,集成测试是一种测试,它使用IUserRepository范围内的UserRepository等实际实现,而不是您的存根,模拟,伪造UserDomain。< / p>