Después de instalar VS2012 Premium en una máquina dev falló una prueba de unidad, por lo que el desarrollador solucionó el problema. Cuando los cambios se enviaron a TeamCity, la prueba de la unidad falló. El proyecto no ha cambiado más que el archivo de la solución que se está actualizando para ser compatible con VS2012. Aún se dirige a .NET framework 4.0System.Uri.ToString cambio de comportamiento después de la instalación de VS2012
He aislado el problema de un problema con los caracteres Unicode que se escapan al llamar al Uri.ToString
. El siguiente código replica el comportamiento.
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
La ejecución de este en VS2010 en una máquina que no tenga instalado VS2012 tiene éxito, la ejecución de este en VS2010 en una máquina con VS2012 instalado falla. Ambos usan la última versión de NCrunch y NUnit de NuGet.
Los mensajes de la aserción no son
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"
-----------------------------------------------------^
La documentación sobre MSDN tanto para .NET 4 y .NET 4.5 muestra que no hay que codificar ToString
este personaje, lo que significa que el comportamiento anterior debería ser el correcto.
A String instance that contains the unescaped canonical representation of the Uri instance. All characters are unescaped except #, ?, and %.
Después de instalar VS2012, se está escapando ese carácter Unicode.
La versión del archivo de System.dll en la máquina con VS2012 es 4.0.30319.17929
La versión del archivo de System.dll en el servidor de compilación es 4.0.30319.236
Haciendo caso omiso de los méritos de por qué somos usando uri.ToString()
, lo que estamos probando y cualquier posible solución alternativa. ¿Alguien puede explicar por qué este comportamiento parece haber cambiado, o es un error?
Editar, aquí está la versión C#
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());
}
}
}
Un poco de investigación adicional, si me meta .NET 4.0 o .NET 4.5 las pruebas fallan, si me cambio a .NET 3.5, entonces tiene éxito.
Soy consciente de que la lógica dicta que estoy haciendo algo mal y no habrá un error en .NET, pero simplemente no puedo trabajar por qué esto está ocurriendo. –
Probablemente 'bool check = @" http://www.example.org/test?helloworld=foo¶bar "== uri.ToString();' es falso, ¿verdad? – t3hn00b
Sí que es falso –