简体   繁体   English

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

[英]Setup mock not working fine (returns exectuted repository method null value)

I have some problem when I setup my mock for add entity.当我为添加实体设置我的模拟时,我遇到了一些问题。 In case when I want get entity/entites my mock-setup is working fine, but when I want create(add).如果我想要获取实体/实体,我的模拟设置工作正常,但是当我想要创建(添加)时。 I setup method for create and it returned null in result.我设置了创建方法,它在结果中返回了 null。

PS AddProductAsync in my suspicion, this method may not work, although I checked in the debug, there is a call to the method PS AddProductAsync 在我的怀疑中,这个方法可能不起作用,虽然我在调试中检查了,有一个方法的调用

 public class ProductServiceTests
{
    private Mock<IProductRepository> _productMockRepo = new Mock<IProductRepository>();
    private ProductService _sut;

    public ProductServiceTests()
    {
        _sut = new ProductService(_productMockRepo.Object);
    }

It's my test method这是我的测试方法

[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 is my service and _productMockRepo is my mock repository _sut 是我的服务,_productMockRepo 是我的模拟存储库

For testing I use NuGet packadge "Moq"对于测试,我使用 NuGet 包装“起订量”

Thanks)谢谢)

The issue is that the expectation was setup to use addingProduct , a specific instance问题是期望被设置为使用addingProduct ,一个特定的实例

_productMockRepo.Setup(x => x.AddProductAsync(addingProduct))
        .ReturnsAsync(addingProduct);

but when exercising the test it is getting another instance created within the member under test但是在执行测试时,它会在被测成员中创建另一个实例

var result = await _sut.AddProductAsync(actualProduct);

which I can only assume does something similar to what was done in the here我只能假设做的事情类似于这里所做的

var addingProduct = new Product {
    Name = actualProduct.Name,
    Price = actualProduct.Price,
    Category = actualProduct.Category,
    Quantity = actualProduct.Quantity
};

since the subject under test (ie: ProductService.AddProductAsync(Product product) ) is not shown.因为未显示正在测试的主题(即: ProductService.AddProductAsync(Product product) )。

Because it is not the actual instance used in the setup the mock will return null by default.因为它不是设置中使用的实际实例,所以默认情况下模拟将返回 null。

In this case, loosen the argument match during setup of expected behavior在这种情况下,在设置预期行为期间放松参数匹配

//...

_productMockRepo
    .Setup(x => x.AddProductAsync(It.IsAny<Product>())) //<-- loosen expected match
    .ReturnsAsync((Product p) => p); //<-- return the argument that was passed to the member

//...

and change the expression for the verification to inspect what was passed并更改验证表达式以检查通过了什么

_productMockRepo.Verify(x => x.AddProductAsync(It.Is<Product>(p => addingProduct.Name == p.Name && ... )), Times.Once);

Reference: MOQ Quickstart - Matching Arguments参考: 起订量快速入门 - 匹配 Arguments

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Frozen Mock 返回 null 但在测试方法中工作正常 - Frozen Mock returns null but works fine inside Test method Moq:Mock SetUp方法仅在测试期间返回null - Moq: Mock SetUp method only returns null during test 如何为存储库方法设置 MVC mock.Setup 和.Returns,它具有输出参数和返回类型 - How to setup MVC mock.Setup and.Returns for a repository method, which has on out parameter and a return type 模拟方法调用返回 null - mock method invocation returns null Rhino Mock-存根方法始终返回null - Rhino Mock - Stubbed method always returns null 如何模拟设置方法以返回不同的值 - How to mock setup a method to return different value 使用 ReturnsAsync 的具有预期对象的模拟存储库返回 Null - Mock Repository With Expected Object Using ReturnsAsync Returns Null 使用 Moq 和 Mock 设置的 IConfiguration 单元测试控制器返回 null - Unit test controller with IConfiguration using Moq and Mock setup returns null 单元测试:用户管理器<applicationuser>模拟设置 FindByIdAsync 返回 NULL</applicationuser> - UnitTests: UserManager<ApplicationUser> Mock Setup FindByIdAsync Returns NULL 在UnitTesting中的Mock框架中返回NULL值 - NULL value returns in Mock framework in UnitTesting
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM