c# - 在测试控制器发布方法时,我如何模拟 MySql 数据库返回的主键
问题描述
我的 xunit 测试失败,因为在单元测试时数据库没有更新预期的 ID。如何模拟数据库创建的 id/主键?
[HttpPost]
public async Task<ActionResult<AccountReadDto>> CreateAccountAsync(AccountCreateDto createAccountDto)
{
var account = _mapper.Map<Account>(createAccountDto); // Id is int equal to 0
await _accountRepo.CreateAccountAsync(account); // repo calls db and updates Id with pk
_accountRepo.SaveChanges();
var accountReadDto = _mapper.Map<AccountReadDto>(account);
return CreatedAtRoute(nameof(GetAccountByIdAsync), new { AccountId = accountReadDto.AccountId }, accountReadDto);
}
[Fact]
public async Task CreateAccountAsync_NewAccount_ReturnsAccountReadDto()
{
var expectedAccount = CreateRandomAccount(); // has id
var createDto = _mapperStub.Map<AccountCreateDto>(expectedAccount); // doesn't have id
_repoStub
.Setup(repo => repo.CreateAccountAsync(expectedAccount))
.Returns(Task.CompletedTask);
var controller = new AccountController(_repoStub.Object, _mapperStub);
var actionResult = await controller.CreateAccountAsync(createDto);
var result = (actionResult.Result as CreatedAtRouteResult).Value as AccountReadDto;
result.Should().BeEquivalentTo(
expectedAccount,
options => options.ComparingByMembers<AccountReadDto>().ExcludingMissingMembers() // excluding login info
);
}
解决方案
此代码不正确:
_repoStub
.Setup(repo => repo.CreateAccountAsync(expectedAccount))
它的设置CreateAccountAsync
仅适用于您将expectedAccount
实例作为参数传递的情况。(映射后就不一样了)。用于It.IsAny<T>()
配置方法以使用任何参数。然后用于Callback<T>(Action<T>)
访问传递给模拟调用的参数:
_repoStub
.Setup(repo => repo.CreateAccountAsync(It.IsAny<Account>()))
.Callback<Account>(a => a.Id = expectedAccount.Id)
.Returns(Task.CompletedTask);
在该代码中,您将CreateAccountAsync
方法配置为返回Task.CompletedTask
并将传入参数 id 修改为expectedAccount.Id
.
Returns(Task.CompletedTask)
可以省略。(这是默认行为)
有关的附加信息Callback<T>
:链接
推荐阅读
- kubernetes - Kubeflow 1.2 不使用 AWS incognito 抱怨用户池客户端但使用 kubeflow 1.0
- python - 如何从 SQL 查询的结果中创建值的字典?
- ionic-framework - ionic 5(电容器)给出 NullInjectorError 空对象磁力计无法访问离子原生功能,
- c# - protobuf-net 缓存模型吗?
- java - 从内部类访问时查看 null :片段
- amazon-web-services - 将 AssumeRolePolicyDocument 限制为单个 lambda
- c# - 如何在 ASP.net、sql server 和 c# 之间传递数据
- office-ui-fabric - 命令栏按钮悬停
- spring-boot - Envers,父亲在删除/创建孩子时未修改
- jenkins - Jenkins 中的“全局环境变量”存储在磁盘上的哪个文件中?