我刚开始测试.net核心web,并且很难在我的API上测试POST方法。我可以断言返回的ActionResult的类型,但我似乎不知道如何将结果与我正在创建的夹具进行比较。
我已经调试了单元测试,并看到CreatedAtAction调用正在返回一个ActionResult。顶层值为null。但是,结果的值有项。
我觉得我错过了一个转换或什么的,我的代码应该期待一个CreatedAtActionResult或其他什么,但我似乎不知道如何使它工作。
下面是来自我的控制器的(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!!
}我正在使用自动夹具和EF内存数据库进行测试。所有这些都是在共享数据库夹具类中设置的,该类在单元测试之前运行。
这是我的调试器输出。

发布于 2019-09-13 20:02:41
在这里,这似乎是对象模型中的一个奇怪之处。但我不知道原因。您调用CreatedAtAction,它返回一个CreatedAtActionResult。它具有一个值属性,它是一个对象。这就是您要传递TodoItem的内容,您可以在调试器输出中看到它。
这个类不是从ActionResult< T>继承的,但这就是函数返回的内容。ActionResult< T>确实有一个隐式运算符,它允许将任何类型转换给它,以及一个用于ActionResult对象(非泛型)的运算符。
因此,当编译器看到您返回一个CreatedAtActionResult时,它需要将其转换为ActionResult< T>,以便从ActionResult调用隐式强制转换(如CreatedAtActionResult : ObjectResult : ActionResult)。
因此,要获得您想要的比较的Todo,您需要:
Assert.Equal(item, (result.Result as CreatedAtActionResult).Value); // SHOULD WORK!!发布于 2020-10-14 13:42:36
Assert.Equal(项目,result.Value);//不工作!
((ObjectResult)actual.Result).Value);// Assert.Equal(项目)--它应该能工作
https://stackoverflow.com/questions/57929044
复制相似问题