NancyFx测试返回无效Json

本文关键字:Json 无效 返回 测试 NancyFx | 更新日期: 2023-09-27 18:25:31

我们使用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));
    }
}

NancyFx测试返回无效Json

我在ObjectId结构(MongoDB)方面遇到了类似的问题,这些结构被序列化为没有引号的JSON。尝试将默认Nancy序列化程序更改为Json.NET:

https://github.com/NancyFx/Nancy.Serialization.JsonNet

它为我解决了这个问题。

我能够让它工作,但解决方案感觉不对。

这是通过从引导程序中删除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));
              });
    }
}