2016-03-19 17 views
2

Aus irgendeinem Grund dieser Test InlineData Verwendung nicht in xUnit:xUnit.net: Warum haben diese 2 äquivalenten Tests unterschiedliche Ergebnisse?

[Theory] 
[InlineData("\uD800", 1)] 
public static void HasLength(string s, int length) 
{ 
    Assert.Equal(length, s.Length); 
} 

während diese, die MemberData verwendet, übergibt:

public static IEnumerable<object[]> HasLength_TestData() 
{ 
    yield return new object[] { "\uD800", 1 }; 
} 

[Theory] 
[MemberData(nameof(HasLength_TestData))] 
public static void HasLength(string s, int length) 
{ 
    Assert.Equal(length, s.Length); 
} 

Was ist der Grund dafür? Habe ich einen Fehler in xUnit.net entdeckt? (Ich glaube, es könnte etwas mit der Tatsache zu tun, dass \uD800 ist ein surrogate character, und es ist irgendwie zu 2 Zeichen übersetzt wird, wenn durch InlineData vorbei. Nicht sicher, warum, aber.)

Antwort

1

Nicolay Antwort keine Antwort auf die Frage, aber tut link es:

Attributwerte gespeichert sind, unter Verwendung von UTF-8, und eine isolierte hohe Surrogat nicht erfolgreich sein kann konvertiert von UTF-16.

Hier ist eine (VB.NET) LinqPad query Bestätigung der Situation.

+1

Ah, das macht jetzt viel mehr Sinn - also ist es kein Fehler in xUnit, aber das ist in das .NET Framework eingebaut. Danke für deine Antwort! –

1

Nein, es ist kein Fehler.

Wenn Sie in UTF-16 einen Wert größer als U + FFFF darstellen möchten, müssen Sie zwei UTF-16-Codeeinheiten verwenden: ein hohes Surrogat (im Bereich 0xD800 bis 0xDBFF) gefolgt von einem niedrigen Surrogat (in der Bereich 0xDC00 bis 0xDFFF). Ein hoher Surrogat allein macht also keinen Sinn. Es ist eine gültige UTF-16-Codeeinheit an sich, aber es hat nur Bedeutung, wenn es von einem niedrigen Ersatzzeichen gefolgt wird.

Weitere Informationen in diesem Artikel http://codeblog.jonskeet.uk/2014/11/07/when-is-a-string-not-a-string/