2016-03-19 29 views
2

, InlineData kullanan bu test xUnit başarısız: Bu sürexUnit.net: Neden bu 2 eşdeğer test farklı sonuçlara sahip? Nedense

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

, MemberData kullandığı geçer:

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); 
} 

Bunun nedeni nedir? XUnit.net'te bir hata keşfettim mi? (Ben \uD800 bir surrogate character olmasından ile ilgili bir şey olabilir düşünüyorum ve InlineData aracılığıyla geçerken bir şekilde 2 karakterlik tercüme vurmayacak. Rağmen neden emin.)

cevap

1

Nikola'nın cevabı soruyu cevaplamak, ama buna link yapar değildir:

Özellik değerleri başarıyla olamaz UTF-8 ve izole bir yüksek suret kullanan saklanır UTF-16'dan dönüştürülmüş.

Durumunuzu onaylayan bir (VB.NET) LinqPad query.

+1

Ah, bu şimdi çok daha mantıklı geliyor - bu yüzden xUnit'te bir hata değil, ancak bu .NET Framework'e yerleşik. Cevabınız için teşekkürler! –

1

Hayır, bu bir hata değil.

UTF-16'da U + FFFF'den daha büyük bir değeri temsil etmek istiyorsanız, iki UTF-16 kod birimi kullanmanız gerekir: yüksek bir vekil (0xD800 - 0xDBFF aralığında) ve ardından düşük bir vekil (0xDC00 aralığı 0xDFFF). Yani kendi başına yüksek bir vekil mantıklı değil. Kendi başına geçerli bir UTF-16 kod birimi, ancak sadece düşük bir vekil tarafından izlendiğinde anlamı vardır.

bu makalede

diğer bilgiler http://codeblog.jonskeet.uk/2014/11/07/when-is-a-string-not-a-string/