Asserzione del confronto della stringa che fallisce quando sembra che dovrebbe passare
-
21-12-2019 - |
Domanda
Ho un test per verificare che un articolo sia serializzato correttamente
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\"}}"
);
}
.
Comunque ottengo il seguente errore sul guasto del test
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.
.
C'è chiaramente qualcosa di speciale che json.net sta facendo alla stringa ma non riesco a capire cosa.
stranamente questo passa
result.Should().Be(
String.Format("{{\"Forename\":\"forename\",\"Surname\":\"surname\",\"Guid\":\"abcdefghijk\"}}")
);
.
Immagino che non sia un grosso problema, ma mi piacerebbe sapere perché.
Soluzione
Ho appena testato e il valore del result
è:
.{"Forenaame": "Forenaame", "cognome": "cognome", "GUID": "AbCDefGhijk", "ID": 0}
che avverrà naturalmente contro la tua stringa prevista di:
."{{\" Foraname \ ": \" Foename \ ", \" cognome \ ": \" cognome \ ", \" GUID \ ": \" AbcDefGhijk \ "}}"
L'utilizzo di bretelle doppie ricci è una sequenza di escape solo per le stringhe di formato utilizzate nel metodo String.Format
in modo che tu possa includere un tutore singolo . Dal formattazione composita MSDN Page :
.Le parentesi graffe di apertura e chiusura sono interpretate come avviamento e fine a formato oggetto. Di conseguenza, è necessario utilizzare una sequenza di fuga da visualizzare un tutore di apertura letterale o una brace di chiusura. Specificare due bretelle di apertura ("{{{{") nel testo fisso per visualizzare un brace di apertura ("{") o due Bretelle di chiusura ("}}") per visualizzare un brace di chiusura ("}").
Se non stai usando String.Format
, allora il doppio brace verrà interpretato letteralmente come due bretelle come da specifica C # specifica 2.4.4.5 poiché non è un personaggio di fuga per le ali letterali di stringa.
Il messaggio di errore risultante è confuso. Non sono sicuro se questo è perché il modo in cui il debugger lo stia segnalando alla GUI, o un errore con il modo in cui stanno formattando il loro messaggio di errore (forse sono brecce eccessivamente aggressive per scappare le bretelle), o cosa.
Se si modifica il test per essere:
result.Should().Be(
"{\"Forename\":\"forename\",\"Surname\":\"surname\",\"Guid\":\"abcdefghijk\"}"
);
.
Allora passerà sospetto. Questo è supportato dal test aggiuntivo utilizzando la chiamata String.Format
che modifica le doppie parentesi graffe a bretelle singole. Ora, se avevi intenzione di avere doppie parentesi graffe attorno al tuo JSON, questo è un altro problema interamente, ma sospetto che non sia il tuo intento.