Nach der Installation von VS2012 Premium auf einem Dev-Computer ist ein Komponententest fehlgeschlagen, sodass der Entwickler das Problem behoben hat. Wenn die Änderungen an TeamCity übertragen wurden, ist der Komponententest fehlgeschlagen. Das Projekt hat sich nicht geändert, außer dass die Lösungsdatei aktualisiert wurde, damit sie mit VS2012 kompatibel ist. Es zielt immer noch. NET Framework 4.0Änderung des System.Uri.ToString-Verhaltens nach Installation von VS2012
Ich habe das Problem auf ein Problem mit Unicode-Zeichen, die beim Aufruf Uri.ToString
aufgerufen werden. Der folgende Code repliziert das Verhalten.
Imports NUnit.Framework
<TestFixture()>
Public Class UriTest
<Test()>
Public Sub UriToStringUrlDecodes()
Dim uri = New Uri("http://www.example.org/test?helloworld=foo%B6bar")
Assert.AreEqual("http://www.example.org/test?helloworld=foo¶bar", uri.ToString())
End Sub
End Class
dies auf einer Maschine in VS2010 ausführen, die nicht VS2012 nicht installiert gelingt, mit VS2012 dies in VS2010 auf einem Computer ausgeführt wird installiert ausfällt. Beide verwenden die neueste Version von NCrunch und NUnit von NuGet.
Die Nachrichten aus dem ausgefallenen assert sind
Expected string length 46 but was 48. Strings differ at index 42.
Expected: "http://www.example.org/test?helloworld=foo¶bar"
But was: "http://www.example.org/test?helloworld=foo%B6bar"
-----------------------------------------------------^
Die Dokumentation auf MSDN sowohl für .NET 4 und .NET 4.5 zeigt, dass ToString
sollte dieses Zeichen nicht kodieren, was bedeutet, dass das alte Verhalten das richtige sein sollte.
A String instance that contains the unescaped canonical representation of the Uri instance. All characters are unescaped except #, ?, and %.
Nach der Installation von VS2012 wird dieses Unicode-Zeichen mit Escapezeichen versehen.
Die Dateiversion von System.dll auf der Maschine mit VS2012 ist 4.0.30319.17929
Die Dateiversion von System.dll auf dem Build-Server 4.0.30319.236
Ignoriert die Verdienste, warum wir sind mit uri.ToString()
, was wir testen und jede mögliche Arbeit um. Kann jemand erklären, warum sich dieses Verhalten geändert hat, oder ist das ein Fehler?
bearbeiten, hier ist die C# -Version
using System;
using NUnit.Framework;
namespace SystemUriCSharp
{
[TestFixture]
public class UriTest
{
[Test]
public void UriToStringDoesNotEscapeUnicodeCharacters()
{
var uri = new Uri(@"http://www.example.org/test?helloworld=foo%B6bar");
Assert.AreEqual(@"http://www.example.org/test?helloworld=foo¶bar", uri.ToString());
}
}
}
Ein bisschen eine weitere Untersuchung, ob ich .NET 4.0 oder .NET 4.5 die Tests fehlschlagen Ziel, wenn ich es auf .NET 3.5 und schalten es gelingt.
mir bewusst bin, dass die Logik diktiert, dass ich etwas falsch, und es mache nicht um einen Fehler in .NET sein, aber ich kann einfach nicht funktionieren warum das passiert. –
Vermutlich 'bool check = @" http://www.example.org/test?helloworld=foo¶bar "== uri.ToString();' ist falsch, oder? – t3hn00b
Ja, das ist falsch –