開発マシンにVS2012Premiumをインストールした後、単体テストが失敗したため、開発者は問題を修正しました。変更がTeamCityにプッシュされたとき、単体テストは失敗しました。プロジェクトは、VS2012と互換性があるようにアップグレードされているソリューションファイル以外は変更されていません。それはまだ.netフレームワーク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
VS2012がインストールされていないマシンでVS2010でこれを実行すると成功し、VS2012がインストールされているマシンでVS2010でこれを実行すると失敗します。どちらも、NuGetの最新バージョンのNCrunchとNUnitを使用しています。
失敗したアサートからのメッセージは次のとおりです。
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"
-----------------------------------------------------^
.NET4と.NET4.5の両方に関するMSDNのドキュメントにはToString
、この文字をエンコードしてはならないことが示されています。つまり、古い動作が正しい動作である必要があります。
A String instance that contains the unescaped canonical representation of the Uri instance. All characters are unescaped except #, ?, and %.
VS2012をインストールした後、そのユニコード文字はエスケープされています。
VS2012を搭載したマシン上のSystem.dllのファイルバージョンは4.0.30319.17929です。
ビルドサーバー上のSystem.dllのファイルバージョンは4.0.30319.236です。
uri.ToString()
使用する理由、テスト対象、および潜在的な回避策のメリットを無視します。この動作が変更されたように見える理由を誰かが説明できますか、それともこれはバグですか?
編集、これが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());
}
}
}
少し詳しく調べてみましょう。.NET4.0または.NET4.5をターゲットにするとテストは失敗し、.NET3.5に切り替えると成功します。