entity-framework-core - 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>();
}
解决方案
推荐阅读
- blazor-webassembly - Blazor WebAssembly Oidc 身份验证在本地工作正常,但在 Azure 静态 Web 应用上,身份验证/登录回调有 404
- javascript - 如何在鼠标点击事件中取回按钮中存在的值
- javascript - 删除表格元素中的白线
- angular - 打字稿 - 如何解决“类型'未定义'不可分配给类型'XXXX'”?
- firebase - 带有 HTML/CSS 的 Firebase 身份验证自定义密码重置模板
- c++ - MATLAB 将函数构建到 c++
- github-api - 通过 CLI 获取 GitHub API 令牌,用于 CLI
- php - 计算特定索引PHP中元素最大值的算法
- javascript - 数组中的文本转换为对象
- php - Laravel 文件图像未显示在生产服务器中