"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);
}
我正在尝试编写测试代码:
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);
}