單元測試保存更改失敗

asp.net-core c# entity-framework-core moq xunit2

構架

.NETCoreApp 1.1
EF Core 1.1.1
Xunit 2.2.0
Moq 4.7.8

控制器發布方法
_yourRepository注入到控制器構造函數中,類型為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())

始終評估為true。當它的計算結果為true時,您可以看到代碼拋出錯誤(由中間件處理)

_yourRepository.Save()方法

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

我不確定如何解決問題,我不能100%確定它為什麼會失敗。

是因為IYourRepository接口不包含Save方法的實現嗎?

如果是這樣,這是否意味著測試Post方法我需要模擬我的DbContext並使用它構建我的YourRepository對象?

任何解釋為什麼這是失敗以及如何糾正它將非常感激

一般承認的答案

您需要設置repo以從異步方法返回正確的任務。 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);
}

熱門答案

替換new Mock<IYourRepository>();使用new Mock<IYourRepository>(MockBehavior.Strict); - 現在,當調用沒有Setup任何方法時,它將拋出異常。

顯然,你不應該檢查(斷言)你沒有確定的東西(比如返回值)。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow