"Cannot resolve parameter" ABP 框架测试错误

"Cannot resolve parameter" error in ABP Framework Test

我正在尝试编写测试代码:

public class SupplierAppServiceTests : ABCApplicationTestBase
{
    private readonly ISupplierAppService _supplierAppService;
    private readonly IWmsCompanyRepository _fakeRepo;

    public SupplierAppServiceTests()
    {
        _fakeRepo = Substitute.For<IWmsCompanyRepository>();
        _supplierAppService = GetRequiredService<ISupplierAppService>();
    }

    [Fact]
    public async Task Should_Be_Generate_Code()
    {
        // Arrange
        _fakeRepo.CreateAsync(Arg.Any<WmsCompany>())
            .Returns(Task.CompletedTask);
        ...
    }
}

但是我得到这个错误:

Autofac.Core.DependencyResolutionException : An exception was thrown while activating MyCompany.ABC.Application.CompanySuppliers.SupplierAppService.
    ---- Autofac.Core.DependencyResolutionException : None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'MyCompany.ABC.Application.CompanySuppliers.SupplierAppService' can be invoked with the available services and parameters:
    Cannot resolve parameter 'MyCompany.ABC.Domain.Wms.Companies.IWmsCompanyRepository wmsCompanyRepository' of constructor 'Void .ctor(MyCompany.ABC.Domain.Companies.SupplierManager, MyCompany.ABC.Domain.Companies.ISupplierRepository, MyCompany.ABC.Domain.Wms.Companies.IWmsCompanyRepository)'.

WmsCompanyRepository class(最后一个参数)实现 IWmsCompanyRepository 向第三方的网络服务发出请求。

SupplierAppService:

public class SupplierAppService : ABCAppService, ISupplierAppService
{
    public SupplierAppService(SupplierManager supplierManager, ISupplierRepository supplierRepository, IWmsCompanyRepository wmsCompanyRepository)
    {
        this.supplierManager = supplierManager;
        this.supplierRepository = supplierRepository;
        this.WmsCompanyRepository = wmsCompanyRepository;
    }

    ...
}

IWmsCompanyRepository:

public interface IWmsCompanyRepository
{
     Task CreateAsync(WmsCompany company);
}

我在 SupplierAppServiceTests class' 构造函数中更改了 _supplierAppService 赋值

来自:

_supplierAppService = GetRequiredService<ISupplierAppService>();

至:

_supplierAppService = new SupplierAppService(_supplierManager, _supplierRepository, _fakeRepo);

SupplierAppService 的方法使用了 ObjectMapper 属性 而这次我得到了这个错误:

ObjectMapper -> System.ArgumentNullException : Value cannot be null. (Parameter 'provider') objectmapper

如何将 IWmsCompanyRepository 正确注入 SupplierAppService 用于测试用例?

我找到了解决方法, 我更改了 SupplierAppService class:

  • 将默认值IWmsCompanyRepository wmsCompanyRepository = null添加到ctor参数
  • 将 WmsCompanyRepository 从字段更改为 public 属性
  • 将 WmsCompanyRepository 属性 添加到 ISupplierAppService

public class SupplierAppService : ABCAppService , ISupplierAppService
{
   public IWmsCompanyRepository WmsCompanyRepository { get; set; }
   public SupplierAppService(SupplierManager supplierManager, ISupplierRepository supplierRepository,IWmsCompanyRepository wmsCompanyRepository = null)
   {
      this.supplierManager = supplierManager;
      this.supplierRepository = supplierRepository;
      this.WmsCompanyRepository = wmsCompanyRepository;
   }
 ...
 }

并更改了 SupplierAppServiceTests 构造器:

public SupplierAppServiceTests()
{
    _fakeRepo = Substitute.For<IWmsCompanyRepository>();
    _supplierAppService = GetRequiredService<ISupplierAppService>();
    _supplierAppService.WmsCompanyRepository = _fakeRepo;
}

将您的 _fakeRepo 单例添加到 services 以便可以解决 SupplierAppService

public SupplierAppServiceTests()
{
    // _fakeRepo = Substitute.For<IWmsCompanyRepository>();
    _supplierAppService = GetRequiredService<ISupplierAppService>();
}

protected override void AfterAddApplication(IServiceCollection services)
{
    _fakeRepo = Substitute.For<IWmsCompanyRepository>();
    services.AddSingleton(_fakeRepo);
}