14

在其中一个动作中,我做了这样的事情

public HttpResponseMessage Post([FromBody] Foo foo)
{
    .....
    .....

    var response = 
          Request.CreateResponse(HttpStatusCode.Accepted, new { Token = "SOME_STRING_TOKEN"});
    return response;
}

和更多类似的方法返回一个匿名类型实例,并且效果很好。

现在,我正在为它编写测试。我有

HttpResponseMessage response = _myController.Post(dummyFoo);

HttpResponseMessage有一个名为的属性Content,并且有一个ReadAsAsync<T>().

我知道如果有具体的特定类型,我可以做

Bar bar = response.Content.ReadAsAsync<Bar>();

但是如何访问返回的匿名类型?是否可以?

我希望做到以下几点:

dynamic responseContent = response.Content.ReadAsAsync<object>();
string returnedToken = responseContent.Token;

但我得到了类型对象实例没有属性令牌的错误。即使调试器显示带有一个属性 Token 的 responseContent,也会发生这种情况。我明白为什么会这样,但我想知道是否有办法访问该物业。

在此处输入图像描述

谢谢

4

2 回答 2

16

.ReadAsAsync<T>是一个异步方法,这意味着它不返回整个反序列化的对象,而是一个Task<T>处理整个异步任务的延续。

你有两个选择:

1. 异步模式。

在您的封闭方法中使用async关键字(例如:)public async void A()并以这种方式进行异步调用:

dynamic responseContent = await response.Content.ReadAsAsync<object>();
string returnedToken = responseContent.Token;

2.常规任务API

或者只使用任务 API:

response.Content.ReadAsAsync<object>().ContinueWith(task => {
   // The Task.Result property holds the whole deserialized object
   string returnedToken = ((dynamic)task.Result).Token;
});

由你决定!

更新

在您发布整个屏幕截图之前,没有人知道您打电话task.Wait是为了等待异步结果。但我会保留我的答案,因为它可能会帮助更多的访客:)

正如我在对自己的答案的评论中建议的那样,您应该尝试反序列化为ExpandoObject. ASP.NET WebAPI 使用 JSON.NET 作为其底层 JSON 序列化程序。也就是说,它可以处理匿名 JavaScript 对象反序列化为 expando 对象。

于 2013-02-05T15:49:15.553 回答
0

您还可以使用类似的以下代码使用单元测试来测试 HttpResponseMessage。

这对我有用。

希望对你有帮助

[TestClass]
    public class UnitTest
    {
        [TestMethod]
        public void Post_Test()
        {
           //Arrange
           var contoller = new PostController();  //the contoller which you want to test
           controller.Request = new HttpRequestMessage();
           controller.Configuration = new HttpConfiguration();

           // Act
           var response = controller.Post(new Number { PhNumber = 9866190822 });
           // Number is the Model name and PhNumber is the Model Property for which you want to write the unit test

           //Assert
           var request = response.StatusCode;
           Assert.AreEqual("Accepted", request.ToString());

        }
    }

同样根据需要改变Assert中的HttpResponseMessage。

于 2019-04-03T10:27:53.990 回答