代码之家  ›  专栏  ›  技术社区  ›  paburgos

Moq无法识别未接收依赖项中所需对象的方法的设置

  •  0
  • paburgos  · 技术社区  · 4 年前

    我现在正在使用Moq。我有一个案例,我不确定自己做错了什么,我希望你能指导我。

    代码和测试是:

    public class MyLogic{
        private readonly IRepository _repository;
    
        public MyLogic(IRepository repository)
        {
            _repository = repository;
        }
        public async Task<Product> Create(Estimate estimate, Policy policy)
        {
            Product product = new Product(policy.Title, estimate.Id);
            return await _repository.Create(product);
        }
    }
    
    [Fact]
    public Class MyLogicTest{
        Mock<IRepository> _repository = new DBRepository();
        MyLogic myLogic =  new MyLogic(_repository);
    
        Estimate _estimate = new Estimate(){
            Id = Guid.Parse("5aa4d4a1-23e4-495b-b990-08da0d38e5df")
        };
    
        Policy _policy = new Policy(){
            Title = "The Title"
        };
    
        public async Task CreateShouldBeDifferentFromNull(){
            Product product = new Product()
            {
                Title = "The Title",
                Id = Guid.Parse("5aa4d4a1-23e4-495b-b990-08da0d38e5df")               
            };
    
            _repository.Setup(g => g.Create(product)).ReturnsAsync(() => product);
            Product createdProduct = await myLogic.Create(_estimate, _policy);
    
            Assert.NotNull(createdProduct);
            Assert.Equal(product.Id, createdProduct.Id);
    
            _repository.Verify(g => g.Create(product));
        }
    }

    Assert总是失败,因为createdProduct总是为null。而且,我知道我可以更改类MyLogic来接收一个乘积,而不是两个参数。但我想要的是按原样测试代码。

    我如何让模拟的IRepository使用我在测试中声明的Product实例,以便测试成功?

    0 回复  |  直到 4 年前
        1
  •  2
  •   funatparties    4 年前

    您需要设置 Create 退货方法 Product 当它接收到类型的实例时 产品 有一些特定的 Title 以及一些具体的 Id 。现在您正在设置 创造 退货方法 产品 当它接收到您创建的对象时。这当然失败了,因为这是另一个完全不同的对象,而不是在你的 创造 方法 因此,将您的设置行更改为: _productRepository.Setup(g => g.Create(It.Is<Product>(p => p.Id == product.Id && p.Title == product.Title)).ReturnsAsync(() => product); 或者,您可以重写Equals方法和==运算符,您的原始代码也可以工作。

    推荐文章