单元测试涉及测试应用程序的最小单元。因此,可以针对UserRepository编写单元测试以测试GetAllUsers()方法。
也可以针对UserDomain编写单元测试以测试GetAllUsers()方法。由于UserDomain调用UserRepository,UserDomain测试会被视为集成测试吗?
如果有一个服务层将API提供给后端,那么UserDomain测试会被视为单元测试吗?
答案 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;
}
}
现在实现的新接口IUserRepository
。 UserRepository
也已更新,而不是新建一个特定的实施(UserDomain
),接受UserRepository
的实例。
这意味着一些事情,IUserRepository
不再直接依赖于UserDomain
,它现在依赖于抽象UserRepository
,它可以很容易地被模拟,存根或伪造成为了测试目的而提供测试功能。
在构造函数中传递接口实现的概念称为dependency injection。构造函数注入是完成依赖注入的一种方法,但也有其他方法。它的基本思想是,如果一个类具有依赖关系,那些依赖关系应该在接口/契约上,而不是文字实现。
综上所述,集成测试是一种测试,它使用IUserRepository
范围内的UserRepository
等实际实现,而不是您的存根,模拟,伪造UserDomain
。< / p>