[Nsubstitute在要测试的方法内部创建参数时总是返回null

问题描述 投票:0回答:1

比方说,我们有一个带有注入的工作单元的服务

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,而第二项服务返回正确的结果?

c# unit-testing .net-core nunit nsubstitute
1个回答
0
投票

第二个有效,因为用于设置测试的实例与执行测试时使用的实例完全相同,而第一个无效,因为被测方法使用自己的实例。

如果您希望测试在两种情况下都有效,则需要松开匹配的参数。

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);
}

参考NSubstitute: Argument matchers

© www.soinside.com 2019 - 2024. All rights reserved.