首页 > 解决方案 > XUnit 如何为 Queryable 设置 Mock?

问题描述

我正在尝试添加负单元测试,但似乎我无法正确调用我的工作单元,我有一个 NotSupportedException 说 Queryable.FirstOrDefault 可能无法在设置/验证表达式中使用。我正在尝试传递错误的客户参考 ID,以便出现异常。

[Fact]
public async Task ExecuteAsync_CustomerNull_ThrowsKeyNotFoundException()
    {
        using (var mock = AutoMock.GetStrict())
        {
            var target = mock.Create<GetCustomerCommand>();
            var parameter = new CustomerRequest { CustomerReferenceID = "unknownuser" };
            var customer = new CustomerEntity { CustomerReferenceID = "knownuser"};

            var customerDataQuery = mock.CreateCustomerDataQuery(customer);
            var unitOfWork = mock.Mock<IUnitOfWork>();
            unitOfWork.Setup(m => m.Add(It.IsAny<CustomerEntity>()));
            unitOfWork.Setup(m => m.GetSet<CustomerEntity>().FirstOrDefault(x => x.CustomerReferenceID == parameter.CustomerReferenceID)).Returns(customer);
            Task result() => target.ExecuteAsync(parameter, null, default);
            await Assert.ThrowsAsync<CustomerNotFoundException>(result);
        }
    }

获取客户命令:

    public async Task<CommandResult<double>> ExecuteAsync(CustomerRequest parameter, ClaimsPrincipal principal, CancellationToken cancellationToken)
    {
     var customer = await this._unitOfWork.GetSet<CustomerEntity>().Include(x => x.CustomerProfile).FirstOrDefaultAsync(x => x.CustomerReferenceID == parameter.CustomerReferenceID);
    if (customer == null)
         {
         var exception = new CustomerNotFoundException($"{nameof(customer)} '{parameter.CustomerReferenceID}' not found");
         throw exception; 
         }
    }

工作单位:

public DbSet<TEntity> GetSet<TEntity>()
           where TEntity : EntityBase
        {
            return this._context.Set<TEntity>();
        }

标签: entity-framework-corexunittestunit

解决方案


推荐阅读