gpt4 book ai didi

c# - 单元测试中的 ActionResult 问题无法断言。POST 返回值等于(asp.net core mvc web api)

转载 作者:行者123 更新时间:2023-12-02 14:47:50 26 4
gpt4 key购买 nike

我是 .net 核心 Web API 的新手,正在努力测试我的 API 上的 POST 方法。我可以断言返回的 ActionResult 的类型,但我似乎无法弄清楚如何将结果与我正在创建的装置进行比较。

我调试了单元测试,发现 CreatedAtAction 调用返回了一个 ActionResult。顶层值为空。但是,结果的值有项目。

我觉得我缺少转换或其他东西,我的代码应该期待 CreatedAtActionResult 或其他东西,但我似乎无法弄清楚如何让它工作。

这是来 self 的 Controller 的 (POST) 方法:

        [HttpPost]
public async Task<ActionResult<TodoItem>> AddTodoItem(TodoItem item)
{
_context.TodoItems.Add(item);
await _context.SaveChangesAsync();

return CreatedAtAction(nameof(GetTodoItem), new { id = item.Id }, item);
}

这是我的单元测试:

        [Fact]
public async Task PostTodoItem_ShouldPass()
{
var fixture = new Fixture();
var item = fixture.Create<TodoItem>();
var result = await _controller.AddTodoItem(item);
Assert.IsType<ActionResult<TodoItem>>(result); // WORKS
Assert.Equal(item, result.Value); // DOESN'T WORK!!
}

我正在使用 Autofixture 和 EF 内存数据库进行测试。所有这些都在单元测试之前运行的共享数据库夹具类中设置。

这是我的调试器输出。

debugger output

最佳答案

这在此处的对象模型中似乎很奇怪。我不知道原因。您调用 CreatedAtAction,它返回一个 CreatedAtActionResult。它有一个 Value 属性,它是一个对象。这就是您将 TodoItem 传递到的对象,您可以在调试器输出中看到它。

此类不继承自 ActionResult< T>,但这是您的函数返回的内容。ActionResult< T> 确实有一个隐式运算符,允许将任何类型转换为它,并且一个用于 ActionResult 对象(非通用)。

因此,当编译器看到您返回一个 CreatedAtActionResult 时,它需要将其转换为 ActionResult< T>,以便从 ActionResult< 调用隐式转换/em>(如 CreatedAtActionResult : ObjectResult : ActionResult)。

因此,要获得要进行比较的待办事项,您需要:

 Assert.Equal(item, (result.Result as CreatedAtActionResult).Value); // SHOULD WORK!!

关于c# - 单元测试中的 ActionResult 问题无法断言。POST 返回值等于(asp.net core mvc web api),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57929044/

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