比方说,我们有一个带有注入的工作单元的服务
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(id,parameter);
}
}
以及类似的服务
public class Service: IService
{
IUnitOfWork unitOfWork;
public Service(IUnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork;
}
public Item getResult(Parameter parameter)
{
return _unitOfWork.Repository.GetItem(id,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,而第二项服务返回正确的结果?
第二个有效,因为用于设置测试的实例与执行测试时使用的实例完全相同,而第一个无效,因为被测方法使用自己的实例。
如果您希望测试在两种情况下都有效,则需要松开匹配的参数。
public void Test() {
var id = 22
Item item = new Item();
item.Id = id;
var parameter = new Parameter(item.Id);
IRepository repository = Substitute.For<IRepository>();
repository.GetItem(Arg.Any<Parameter>()).Returns(item);
IUnitOfWork unitOfWork = Substitute.For<UnitOfWork>(repository);
IService service1 = new Service1(unitOfWork);
IService service2 = new Service2(unitOfWork);
//Act
var result1 = service1.GetResult(id);
var result2 = service2.GetResult(parameter);
//Assert
Assert.That(result1.Id == item.Id);
Assert.That(result2.Id == item.Id);
}