[英]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 且StartDate
和EndDate
設置為DateTime.Now
,
您的測試應該在測試方法中使用model.StartDate
和model.EndDate
而不是startDate
和endDate
。 因為他們的價值觀會不同。
[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.EndDate
和model.StartDate
如果您不關心開始和結束日期值的匹配,您可以...
A.CallTo(() => nprAppService.Completed<ExpandoObject>(nprUserId, A<DateTime>._, A<DateTime>._))
.Returns(r);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.