2015-06-27 23 views
1

我试图徒劳地断言来自南希端点的Json响应。在南希测试REST API

这里的被测模块:

public MyModule() 
    { 
     Get["/mypath", true] = async (parameters, ct) => 
     { 
      ... 

      return something.ToDictionary(x => x.Key, x => x.Value); 
     }; 
    } 

如何编写一个测试,验证在响应中词典的内容?

我已经尝试了所有种类的东西,比如:

  var bootstrapper = new MyBootstrapper(); 
      var browser = new Browser(bootstrapper); 

      var result = browser.Get("/mypath", 
       with => 
       { 
        with.Accept(new MediaRange("application/json")); 
       }); 

      Assert.AreEqual(HttpStatusCode.OK, result.StatusCode, "Body: " + Encoding.UTF8.GetString(result.Body.ToArray())); 
      Assert.That(result.GetModel<IDictionary<string, string>>()[SOME_KEY], Is.EqualTo("expected value")); 

我已经和尝试没有兴田MediaRange,并试图了解在字典可以在响应中找到,但能似乎无处不在。 result.GetModel似乎并不包含结果字典。

我能看到结果的唯一方法就是看Encoding.UTF8.GetString(result.Body.ToArray())。这给出了原始的JSON。但是:

  1. 手动解码的字节数组是丑陋的,
  2. 我宁愿一个JSON对象,而不是一个字符串。这可能吗?

回答

0

词典是在一个响应体内。您可以使用特殊方法从Nancy.Testing框架反序列化体内转化为特定的格式,如DeserializeJsonNancy.Testing - test-dialogues with Requests and Response

// Replace dictionary type parameters with yours 
var actualValue = result.Body.DeserializeJson<Dictionary<object, object>>(); 

更多关于马库斯Hammarbergs博客NancyFx测试的细节。

+0

谢谢,我稍后再看看! –

+0

GetModel 和DeserializeJson 扩展方法有什么区别? – reckface