Asp.net web api 当从请求创建HttpResponseMessage时,现在应该如何测试API控制器?

Asp.net web api 当从请求创建HttpResponseMessage时,现在应该如何测试API控制器?,asp.net-web-api,Asp.net Web Api,现在,当使用HttpResponseMessage和内容创建响应的构造函数消失时,如果要测试控制器,您应该如何做?应改用Request.CreateResponse,如下所示: public HttpResponseMessage Post() { // Do Something var response = Request.CreateResponse<SomeType>(System.Net.HttpStatusCode.OK, someObject);

现在,当使用HttpResponseMessage和内容创建响应的构造函数消失时,如果要测试控制器,您应该如何做?应改用Request.CreateResponse,如下所示:

public HttpResponseMessage Post()
{
    // Do Something
    var response = Request.CreateResponse<SomeType>(System.Net.HttpStatusCode.OK, someObject);
    return response;
}

现在要测试这样的控制器,我必须存根请求对象,因为这是基类上的一个属性,我应该使用它来创建响应,但这不是我喜欢的,我想知道是否可以用其他方法来实现它?

根据我的经验,如果不需要修改HttpResponseMessage,请避免在ApiController中使用它,这将使您的代码更简单:

public SomeType Post()
{
     // Do Something
     return someObject;
}
如果无法避免,以下是您的答案:


如果您不返回HttpResponseMessage,那么WebApi将为您调用MediaTypeFormatter将结果写入响应流,即它将使用MediaTypeFormatter为您创建HttpResponseMessage。许多默认实现将执行与上面类似的操作。最简单的解决方案是从函数中返回SomeType,然后利用其中一个内置的MediaTypeFormatter进行转换。您可以单独和一起测试这两种解决方案。

我认为您错了,您将如何使用您的方法控制http状态代码?状态代码不是您应该从MediaTypeFormatter控制的。如果您关心返回各种状态代码,例如a 201,您可以选择更改要包装在已创建对象或其他内容中的某种类型。对于这类工作,您还可以选择ActionFilter。很明显,每个实现都是不同的,这并不能适用于所有情况……但这正是HttpResponseMessage的目的,他们现在已经删除了HttpResponseMessage。按照你的建议去做感觉像是在框架下工作,而不是在框架下工作。我想你的答案是最正确的,但我不喜欢。如果你问我的话,微软对API所做的改变使得它不太容易测试。