我们正在使用NancyFx来托管单个页面应用程序和多个ReST端点。代码和测试使用相同的引导程序,唯一的区别是在测试中我们从测试框架中使用Nancy Browser。
如果我从网站返回一个简单的对象,一切都按预期通过应用程序或测试框架运行。然而,真正的问题是我们返回的对象包含一些动态数据,尽管它本身不是动态对象。应用程序工作正常,但测试失败,因为JSON无效,字符串缺少引号,日期格式不正确。
var browser = new Browser(bootstrapper);
_response = browser.Get("http://localhost/...", with =>
{
with.HttpRequest();
with.Header("Accept", "application/json");
});
var bstr = _response.Body.AsString();
我在测试时将一个方法附加到管道AfterRequest方法,我可以通过查看NancyContext上的Response属性看到JSON字符串看起来很好但是只要我们从浏览器返回响应对象并将其转换为一个字符串,它不再是有效的JSON。
protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
{
base.ApplicationStartup(container, pipelines);
pipelines.AfterRequest += Foo;
}
private void Foo(NancyContext obj)
{
//Can see the Response on the NancyContext here
}
如果我无法解决这个问题,我会考虑放弃Nancy测试框架,并在测试环境中自行托管。
修改
我使用NancySelfHost获得了类似的结果。在使用自托管或测试浏览器时,看起来它没有拿起Json.Net序列化程序。我正在使用在Tiny IoC https://github.com/NancyFx/Nancy.Serialization.JsonNet中注册自定义序列化器的标准设置。
public class CustomJsonSerializer : JsonSerializer
{
public CustomJsonSerializer()
{
this.ContractResolver = new CamelCasePropertyNamesContractResolver();
this.Formatting = Formatting.Indented;
}
}
public class Bootstrapper : DefaultNancyBootstrapper
{
protected override void ConfigureApplicationContainer(TinyIoCContainer container)
{
base.ConfigureApplicationContainer(container);
container.Register(typeof(JsonSerializer), typeof(CustomJsonSerializer));
}
}
答案 0 :(得分:1)
我遇到了与ObjectId结构(MongoDB)类似的问题,它们被序列化为JSON而没有引号。 尝试将默认的Nancy序列化程序更改为Json.NET:
https://github.com/NancyFx/Nancy.Serialization.JsonNet
它为我解决了这个问题。
答案 1 :(得分:1)
我能够让它工作但解决方案感觉不对。
这是通过删除Json.Net自定义序列化程序并从引导程序连接而完成的。
container.Register(typeof(JsonSerializer), typeof(CustomJsonSerializer));
手动将JsonNetSerializer添加到内部配置中。
protected override NancyInternalConfiguration InternalConfiguration
{
get
{
return NancyInternalConfiguration
.WithOverrides(nic =>
{
...
nic.Serializers.Clear();
nic.Serializers.Insert(0, typeof(JsonNetSerializer));
});
}
}