gpt4 book ai didi

c# - 单元测试保存更改失败

转载 作者:太空宇宙 更新时间:2023-11-03 22:59:53 25 4
gpt4 key购买 nike

框架

.NETCoreApp 1.1
EF Core 1.1.1
Xunit 2.2.0
Moq 4.7.8

Controller 发布方法
_yourRepository 被注入(inject)到 Controller 构造函数中,类型为 IYourRepository

[HttpPost(Name = "CreateMethod")]
public async Task<IActionResult> CreateMethod([FromBody] ObjectForCreationDto objectDto)
{
if (objectDto== null)
{
return BadRequest();
}

if (!ModelState.IsValid)
{
return BadRequest();
}

await _yourRespository.CreateObject(objectDto);

if (!await _yourRespository.Save())
{
throw new Exception("Creating this object failed on save.");
}

return Ok();
}

单元测试失败

[Fact]
public async Task CreateObject_WhenGoodDtoReceived_SuccessStatusReturned()
{
// Arrange
var mockRepo = new Mock<IYourRepository>();
var controller = new YourController(mockRepo.Object);
var objectForCreationDto = new ObjectForCreationDto { Code = "0001", Name = "Object One" };

// Act
var result = await controller.CreateObject(objectForCreationDto);

// Assert
Assert.IsType<OkObjectResult>(result);
}

测试失败,因为行

if (!await _yourRespository.Save())

始终计算为真。当它计算为真时,您可以看到代码抛出错误(由中间件处理)

_yourRepository.Save() 方法

public async Task<bool> Save()
{
return (await _yourContext.SaveChangesAsync() >= 0);
}

我不确定如何解决问题,也不是 100% 确定失败的原因。

是不是因为模拟的 IYourRepository 接口(interface)不包含 Save 方法的实现?

如果是这样,是否意味着要测试 Post 方法我需要模拟我的 DbContext 并使用它构造我的 YourRepository 对象?

如果能解释为什么会失败以及如何纠正它,我们将不胜感激

最佳答案

您需要设置存储库以从异步方法返回正确的任务。 Moq 允许使用 ReturnsAsync

[Fact]
public async Task CreateObject_WhenGoodDtoReceived_SuccessStatusReturned()
{
// Arrange
var mockRepo = new Mock<IYourRepository>();
mockRepo.Setup(_ => _.Save()).ReturnsAsync(true);//<-- ADD THIS
var controller = new YourController(mockRepo.Object);
var objectForCreationDto = new ObjectForCreationDto { Code = "0001", Name = "Object One" };

// Act
var result = await controller.CreateObject(objectForCreationDto);

// Assert
Assert.IsType<OkObjectResult>(result);
}

关于c# - 单元测试保存更改失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43539646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com