【问题标题】:Assert.Equal can not convert error while xUnit testingxUnit 测试时 Assert.Equal 无法转换错误
【发布时间】:2020-05-26 09:38:19
【问题描述】:

我正在尝试测试以下方法:

[Route("api/title")]
[HttpPost()]
public IActionResult InsertTitle([FromBody] GtlTitle gtlTitle)
{
    string pattern = "[0-9]*[-| ][0-9]*[-| ][0-9]*[-| ][0-9]*";
    Match m = Regex.Match(gtlTitle.ISBN, pattern, RegexOptions.IgnoreCase);
    if (m.Success)
    {
        try
        {
            return Ok(_gtlTitleRepository.InsertTitle(gtlTitle));
        }
        catch (Exception e)
        {
            return BadRequest();
        }
    }
    else
        return BadRequest("Could not match");

}

对于正面测试用例,我写了如下代码:

[Fact]
public void Insert_Title_When_ISBN_Valid()
{
    DateTime d = new DateTime(1999, 6, 1);
    var repositoryMock = new Mock<IGtlTitleRepository>();
    var title = new GtlTitle() { ISBN = "978-0-105-696", VolumeName = "vname", TitleDescription = "desc", PublicationDate = d, 
                                     AuthorID = 2, PublisherID = 2, TempID = 77774};
    repositoryMock.Setup(r => r.InsertTitle(title)).Returns(title);

    var controller = new TitleController(repositoryMock.Object);

    var result = controller.InsertTitle(title);
    Assert.Equal(title, result);
}

在线:Assert.Equal(title, result); 我收到以下错误:

参数 1:无法从“GTL.Models.Books.GtlTitle”转换为“字符串”

参数 2:无法从“Microsoft.AspNetCore.Mvc.IActionResult”转换为字符串

我的单元测试出了什么问题?为什么它期望对象是字符串类型的?

【问题讨论】:

    标签: c# unit-testing asp.net-core xunit webapi


    【解决方案1】:

    控制器操作返回IActionResult,但您将它与Title 对象进行比较。相反,您应该检查它是否为 OkObjectResult 并验证它的值:

    var result = controller.InsertTitle(title);
    var okResult = Assert.IsType<OkObjectResult>(result);
    Assert.Equal(title, okResult.Value);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 2018-09-23
    相关资源
    最近更新 更多