【发布时间】:2016-08-14 21:44:43
【问题描述】:
我想要模拟惰性接口,但我得到了object reference not set to an instance of an object 异常。
这是正在测试的课程:
public class ProductServiceService : IProductServiceService
{
private readonly Lazy<IProductServiceRepository> _repository;
private readonly Lazy<IProductPackageRepository> _productPackageRepository;
public ProductServiceService(
Lazy<IProductServiceRepository> repository,
Lazy<IProductPackageRepository> productPackageRepository)
{
_repository = repository;
_productPackageRepository = productPackageRepository;
}
public async Task<OperationResult> ValidateServiceAsync(ProductServiceEntity service)
{
var errors = new List<ValidationResult>();
if (!await _productPackageRepository.Value.AnyAsync(p => p.Id == service.PackageId))
errors.Add(new ValidationResult(string.Format(NameMessageResource.NotFoundError, NameMessageResource.ProductPackage)));
.
.
.
return errors.Any()
? OperationResult.Failed(errors.ToArray())
: OperationResult.Success();
}
}
这里是测试类
[Fact, Trait("Category", "Product")]
public async Task Create_Service_With_Null_Financial_ContactPerson_Should_Fail()
{
// Arrange
var entity = ObjectFactory.Service.CreateService(packageId: 1);
var fakeProductServiceRepository = new Mock<Lazy<IProductServiceRepository>>();
var repo= new Mock<IProductPackageRepository>();
repo.Setup(repository => repository.AnyAsync(It.IsAny<Expression<Func<ProductPackageEntity, bool>>>()));
var fakeProductPackageRepository = new Lazy<IProductPackageRepository>(() => repo.Object);
var sut = new ProductServiceService(fakeProductServiceRepository.Object, fakeProductPackageRepository);
// Act
var result = await sut.AddServiceAsync(service);
// Assert
Assert.False(result.Succeeded);
Assert.Contains(result.ErrorMessages, error => error.Contains(string.Format(NameMessageResource.NotFoundError, NameMessageResource.ProductPackage)));
}
fakeProductPackageRepository 始终为空。我关注了这篇博文,但仍然收到空引用异常。
How to mock lazy initialization of objects in C# unit tests using Moq
【问题讨论】:
-
显示
sut.AddServiceAsync的实现。它不是在不完整的例子中。请提供minimal reproducible example -
fakeProductPackageRepository不应该是null,因为在你的例子中你new在将它注入到 sut 之前就上升了。 -
从您上次更新开始:
fakeProductPackageRepository不是null。fakeProductPackageRepository的内部Value是null。Lazy<T>.Value只会在您第一次访问时实现。您还会注意到IsValueCreated是false。那是因为那时没有调用Value来调用工厂函数。 -
我添加了另一个屏幕截图,显示在方法中调用 repo 也是空的。
标签: c# unit-testing mocking moq