2014-10-02 51 views
2

我們使用NancyFx來託管單個頁面應用程序和多個ReST端點。代碼和測試使用相同的引導程序,唯一的區別是在測試中我們使用測試框架中的Nancy Browser。NancyFx測試返回無效的Json

如果我從網站返回一個簡單的對象,那麼所有的功能都可以像預期的那樣通過應用程序或測試框架進行。然而,真正的問題是我們要返回的對象包含一些動態數據,儘管它本身不是一個動態對象。該應用程序工作正常,但測試失敗,因爲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方法的方法,同時測試,我可以看到JSON字符串看起來不錯,通過觀察在NancyContext響應特性,但只要我們得到的響應對象返回從瀏覽器並將其轉換爲字符串,它不再有效的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 
} 

如果我不能解決這個問題,我會考慮放棄南希測試框架,只是在測試環境中自我託管。

編輯

我得到使用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

我能夠得到它的工作,但解決方案感覺不對。

這是通過刪除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)); 
       }); 
    } 
} 
1

我有類似的問題與ObjectId結構(MongoDB),它們被序列化爲JSON沒有引號。 嘗試改變默認南希序列化Json.NET:

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

它解決了這個問題對我來說。

+0

我沒有提到它的問題的第一部分,但在編輯我提到這是用在自拍主機或當我們在做什麼,但是Json.Net串行沒有被拾起南希測試瀏覽器。只有在通過Asp.Net託管時。我確實有一個工作,我將作爲答案發布。 – Bronumski 2014-10-07 12:51:02

+0

奇怪 - 我在自己的主機上檢查了它,並且它與來自nuget的Json.NET序列化程序工作正常。 – 2014-10-07 16:05:07