После установки VS2012 Premium на dev-машине произошел сбой unit test, поэтому разработчик исправил проблему. Когда изменения были перенесены в TeamCity, сбой unit test. Проект не изменился, кроме файла решения, который был обновлен, чтобы быть совместимым с VS2012. Он по-прежнему нацелен на .net framework 4.0
Я изолировал проблему от проблемы, когда символы unicode были экранированы при вызове Uri.ToString
. Следующий код воспроизводит поведение.
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
Запуск этого в VS2010 на компьютере, на котором не установлен VS2012, выполняется успешно, при запуске этого в VS2010 на машине с установленным VS2012 происходит сбой. Оба используют последнюю версию NCrunch и NUnit от NuGet.
Сообщения из отказавшего утверждения
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"
-----------------------------------------------------^
Документация на MSDN для .NET 4 и .NET 4.5 показывает, что ToString
не должен кодировать этот символ, что означает, что старое поведение должно быть правильным.
A String instance that contains the unescaped canonical representation of the Uri instance. All characters are unescaped except #, ?, and %.
После установки VS2012 этот символ юникода экранируется.
Файловая версия System.dll на машине с VS2012 - 4.0.30319.17929
Файловая версия System.dll на сервере сборки 4.0.30319.236
Игнорируя достоинства использования uri.ToString()
, то, что мы тестируем, и любая потенциальная работа. Может ли кто-нибудь объяснить, почему это поведение, похоже, изменилось или это ошибка?
Изменить, вот версия С#
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());
}
}
}
Немного дальнейшего исследования, если я нацелился на .NET 4.0 или .NET 4.5, тесты терпят неудачу, если я переключу его на .NET 3.5, тогда он преуспеет.