如何解决设置模拟无法正常工作返回执行的存储库方法空值
我在为添加实体设置模拟时遇到了一些问题。如果我想要获取实体/实体,我的模拟设置工作正常,但是当我想要创建(添加)时。我设置了 create 方法,结果返回 null。
P.S AddProductAsync 在我的怀疑中,这个方法可能行不通,虽然我在调试中检查,但有调用该方法
public class ProductServiceTests
{
private Mock<IProductRepository> _productMockRepo = new Mock<IProductRepository>();
private ProductService _sut;
public ProductServiceTests()
{
_sut = new ProductService(_productMockRepo.Object);
}
这是我的测试方法
[Fact]
public async Task AddProduct_ShouldReturnProduct_WhenInputDataIsCorrect()
{
//Arrange
var productId = Guid.NewGuid().ToString();
var actualProduct = new ProductModel
{
Name = "test",Price = 1,Category = Category.Foods,Quantity = 2
};
var addingProduct = new Product
{
Name = actualProduct.Name,Price = actualProduct.Price,Category = actualProduct.Category,Quantity = actualProduct.Quantity
};
_productMockRepo.Setup(x => x.AddProductAsync(addingProduct))
.ReturnsAsync(addingProduct);
//Act
var result = await _sut.AddProductAsync(actualProduct);
//Assert
Assert.Equal(actualProduct.Name,result.Name);
_productMockRepo.Verify(x => x.AddProductAsync(addingProduct),Times.Once);
}
}
_sut 是我的服务,_productMockRepo 是我的模拟仓库
为了测试,我使用 NuGet 包“Moq”
谢谢)
解决方法
问题是期望被设置为使用 addingProduct
,一个特定的实例
_productMockRepo.Setup(x => x.AddProductAsync(addingProduct))
.ReturnsAsync(addingProduct);
但是在进行测试时,它会在被测成员中创建另一个实例
var result = await _sut.AddProductAsync(actualProduct);
我只能假设它的作用与此处所做的类似
var addingProduct = new Product {
Name = actualProduct.Name,Price = actualProduct.Price,Category = actualProduct.Category,Quantity = actualProduct.Quantity
};
因为测试对象(即:ProductService.AddProductAsync(Product product)
)未显示。
因为它不是设置中使用的实际实例,所以默认情况下模拟将返回 null。
在这种情况下,请在设置预期行为期间放松参数匹配
//...
_productMockRepo
.Setup(x => x.AddProductAsync(It.IsAny<Product>())) //<-- loosen expected match
.ReturnsAsync((Product p) => p); //<-- return the argument that was passed to the member
//...
并更改验证的表达式以检查通过的内容
_productMockRepo.Verify(x => x.AddProductAsync(It.Is<Product>(p => addingProduct.Name == p.Name && ... )),Times.Once);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。