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é.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top