设置模拟无法正常工作返回执行的存储库方法空值

如何解决设置模拟无法正常工作返回执行的存储库方法空值

我在为添加实体设置模拟时遇到了一些问题。如果我想要获取实体/实体,我的模拟设置工作正常,但是当我想要创建(添加)时。我设置了 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);

参考:MOQ Quickstart - Matching Arguments

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?