【发布时间】:2020-03-28 03:54:38
【问题描述】:
假设我们有一个带有注入工作单元的服务
public class Service: IService
{
IUnitOfWork unitOfWork;
public Service(IUnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork;
}
public Item getResult(int id)
{
var parameter = new Parameter(id);
return _unitOfWork.Repository.GetItem(parameter);
}
}
还有这样的服务
public class Service: IService
{
IUnitOfWork unitOfWork;
public Service(IUnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork;
}
public Item getResult(Parameter parameter)
{
return _unitOfWork.Repository.GetItem(parameter);
}
}
我想通过使用 NUnit 和 NSubstitute 的测试来测试这两个服务,如下所示:
public void Test()
{
Item item= new Item();
item.Id = 22;
Param param = new param(item.Id);
IRepository repository = Substitute.For<IRepository>();
repository.GetItem(param).Returns(item);
IUnitOfWork unitOfWork = Substitute.For<UnitOfWork>(repository);
IService sut= new Service(unitOfWork);
// var result = service.GetResult(id) //Example for first service, returns null
var result = service.GetResult(param)//Example for second service, returns item
Assert.That(result.Id == item.Id);
}
我想知道为什么第一个服务在测试时返回 null 而第二个服务返回正确的结果?
【问题讨论】:
-
顺便说一句,我认为测试应该有
Substitute.For<IUnitOfWork>(使用接口而不是UnitOfWork类),或者可能使用真正的UnitOfWork类。对于 NSubstitute,我们需要是 very careful using classes。将NSubstitute.Analyzers 添加到您的测试项目将有助于找出可能导致问题的案例。 -
@David Tchepak 是的,我非常同意,最安全的方法是使用界面,也就是说这只是一个突出不同之处的示例
标签: c# unit-testing .net-core nunit nsubstitute