2014-01-09 40 views
2

我有一個測試用於檢查一個項目是否正確序列字符串比較斷言失敗時,它看起來像它應該通過

public interface IMyJsIdentity 
{ 
    string Forename { get; } 
    string Surname { get; } 
    string Guid { get; }     
} 

public class MyIdentity : IMyJsIdentity 
{ 
    public string Forename { get; set; } 
    public string Surname { get; set; } 
    public string Guid { get; set; } 
    public int Id { get; set; } 
} 

[Fact] 
public void SerialiseCorrectly() 
{ 
    // Arrange 
    MyIdentity identity = new MyIdentity() 
    { 
     Forename = "forename", 
     Surname = "surname", 
     Guid = "abcdefghijk" 
    }; 

    // Act 
    string result = JsonConvert.SerializeObject(
     identity, 
     new JsonSerializerSettings() 
     { 
      ContractResolver = new InterfaceContractResolver(typeof(IMyJsIdentity)) 
     }); 

    // Assert 
    result.Should().Be(
     "{{\"Forename\":\"forename\",\"Surname\":\"surname\",\"Guid\":\"abcdefghijk\"}}" 
     ); 
} 

但是我得到的測試失敗

Xunit.Sdk.AssertException: Expected string to be 
"{{\"Forename\":\"forename\",\"Surname\":\"surname\",\"Guid\":\"abcdefghijk\"}}" with a length of 66, but 
"{{\"Forename\":\"forename\",\"Surname\":\"surname\",\"Guid\":\"abcdefghijk\"}}" has a length of 64. 

以下錯誤Json.net對字符串做的事情顯然很特別,但我無法弄清楚什麼。

古怪此通過

result.Should().Be(
    String.Format("{{\"Forename\":\"forename\",\"Surname\":\"surname\",\"Guid\":\"abcdefghijk\"}}") 
    ); 

我想這不是什麼大不了的事,但我想知道這是爲什麼。

+0

嘗試調試它並查看兩個字符串的內部char數組,這可能會給你一個asnwer什麼可能是錯的。 –

+1

我想這個問題出現在你的'.Should().Be()'方法中。這些字符串是完全相同的長度,但它報告他們是不同的。可能是因爲計數引號的時間越長? – MaineCoder

+0

有任何理由有雙'{{'和'}}'?如果在某個字符串上對該字符串進行了「String.Format」調用,則會將它們轉換爲單個大括號。這也可能是輸出消息中的錯誤信息/錯誤將額外花括號括起來。編輯:同樣,如果你不使用'String.Format'調用,那麼雙括號不會充當轉義字符,除非你打算使用2個大括號,否則不應該將它們加倍。 –

回答

4

我只是測試和result值是:

{ 「用名字」: 「用名字」, 「姓」: 「姓」, 「GUID」: 「ABCDEFGHIJK」, 「ID」:0 }

這自然無法針對你的期望的字符串:

「{{\」 用的名字\ 「:\」 用的名字\」,\ 「姓\」:\ 「姓\」, \「Guid \」:\「abcdefghijk \」}}「

使用雙花括號是僅用於String.Format方法中的格式字符串的轉義序列,因此您可以包含單個大括號。從Composite Formatting MSDN page

打開和關閉括號被解釋爲開始和結束 格式項。因此,您必須使用轉義序列來顯示 文字左右大括號或右大括號。在固定文本中指定兩個開放大括號 (「{{」)以顯示一個大括號(「{」)或兩個 大括號(「}}」)以顯示一個大括號(「}」)。

如果你不使用String.Format,然後雙括號將字面上解釋爲兩個大括號爲每C# Specification 2.4.4.5,因爲它不是字符串文字的轉義字符。

由此產生的錯誤信息令人困惑。我不知道這是因爲調試器如何將其報告給GUI,或者它們是如何格式化錯誤消息的錯誤(也許它們是過度激進的轉義括號以用於輸出),或者是什麼。

如果你改變你的測試是:

result.Should().Be(
     "{\"Forename\":\"forename\",\"Surname\":\"surname\",\"Guid\":\"abcdefghijk\"}" 
     ); 

然後,它會通過我懷疑。這是通過使用String.Format調用的附加測試進行備份的,該調用將雙花括號改爲單花括號。現在,如果你打算在你的JSON上使用雙重包裝,那完全是另一個問題,但我懷疑這不是你的意圖。

+0

你是完全正確的,謝謝你。我陷入讓它失敗的陷阱,然後把我的期望從測試失敗窗口中複製出來。 – Neil