簡體   English   中英

在 C# 中偽造通用方法調用不會使用 FakeItEasy 返回正確的 object

[英]Faking a generic method call in C# is not returning the correct object with FakeItEasy

我有這個方法需要測試

    public async Task<IActionResult> Completed(string nprUserId, [FromBody] DateRangeDto model)
    {
        var result = await _geAppService.Completed<ExpandoObject>(nprUserId, model.StartDate, model.EndDate);
        var r = result as OperationResult;

        if (r == null)
        {
            // There is no error.  Return JSON
            return Json(result, camelCaseOption);
        }
        else
        {
            // An error occurred.  Return a 404 and include the error message
            return NotFound(r.ErrorMessage);
        }
    }

這是我的測試

    [Fact]
    [Trait("Controller", "Completed")]
    public async Task Completed_WhenRIsNotNull_ReturnNotFoundWithMessage()
    {
        //arrange
        string nprUserId = string.Empty;
        var model = CreateRandomDateRangeDto();
        OperationResult r = CreateRandomOperationResult();
        var startDate = DateTime.Now;
        var endDate = DateTime.Now;

        //I tried this
        A.CallTo(nprAppService)
            .Where(call => call.Method.Name == "Completed")
            .WithReturnType<OperationResult>()
            .Returns(r);
       //I tried this as well
        A.CallTo(() => nprAppService.Completed<ExpandoObject>(nprUserId, startDate, endDate))
            .Returns(r);

        //act
        var result = await controller.Completed(nprUserId, model);

        // Assert
        A.CallTo(() => nprAppService.Completed<ExpandoObject>(nprUserId, startDate, endDate))
            .MustHaveHappened();
        result.Should().BeOfType<NotFoundObjectResult>()
            .Subject.Value.Should().BeOfType<string>();
    }

當調用sut : controller 時,Complete 泛型方法返回 object 而不是 OperationResult。

我該如何解決這個問題?

假設CreateRandomDateRangeDto返回 model 且StartDateEndDate設置為DateTime.Now

您的測試應該在測試方法中使用model.StartDatemodel.EndDate而不是startDateendDate 因為他們的價值觀會不同。

 [Fact]
 [Trait("Controller", "Completed")]
 public async Task Completed_WhenRIsNotNull_ReturnNotFoundWithMessage()
 {
     //arrange
     string nprUserId = string.Empty;
     var model = CreateRandomDateRangeDto();
     OperationResult r = CreateRandomOperationResult();

     A.CallTo(() => nprAppService.Completed<ExpandoObject>(nprUserId, model.StartDate, model.EndDate))
        .Returns(r);

    //act
    var result = await controller.Completed(nprUserId, model);

    // Assert
    A.CallTo(() => nprAppService.Completed<ExpandoObject>(nprUserId, model.StartDate, model.EndDate))
        .MustHaveHappened();
    result.Should().BeOfType<NotFoundObjectResult>()
        .Subject.Value.Should().BeOfType<string>();
}

更新:進一步解釋

對於通過傳遞假 object 進行配置的第一種方法,返回類型應包括Task

A.CallTo(nprAppService)
    .Where(call => call.Method.Name == "Completed")
    .WithReturnType<Task<OperationResult>>()
    .Returns(r)

第二種方法需要精確的值/對象才能返回指定的 object。 這就是為什么該測試僅適用於model.EndDatemodel.StartDate

如果您不關心開始和結束日期值的匹配,您可以...

A.CallTo(() => nprAppService.Completed<ExpandoObject>(nprUserId, A<DateTime>._, A<DateTime>._))
                .Returns(r);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM