Sau khi cài đặt VS2012 Premium trên máy dev, kiểm tra đơn vị không thành công, vì vậy nhà phát triển đã khắc phục vấn đề. Khi các thay đổi được đẩy vào TeamCity, kiểm tra đơn vị không thành công. Dự án đã không thay đổi khác với tệp giải pháp đang được nâng cấp để tương thích với VS2012. Nó vẫn nhắm mục tiêu .net framework 4.0Thay đổi hành vi của hệ thống.Uri.ToString sau khi cài đặt VS2012
Tôi đã tách sự cố xảy ra với các ký tự unicode bị thoát khi gọi Uri.ToString
. Mã sau đây sao chép hành vi.
Chạy trong VS2010 trên máy chưa cài đặt VS2012 thành công, chạy trong VS2010 trên máy có cài đặt VS2012 không thành công. Cả hai đều sử dụng phiên bản mới nhất của NCrunch và NUnit từ NuGet.
Các thông điệp từ khẳng định thất bại là
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"
-----------------------------------------------------^
Các tài liệu trên MSDN cho cả .NET 4 và .NET 4.5 cho thấy ToString
không nên mã hóa nhân vật này, có nghĩa là hành vi cũ phải là hành vi đúng.
A String instance that contains the unescaped canonical representation of the Uri instance. All characters are unescaped except #, ?, and %.
Sau khi cài đặt VS2012, ký tự unicode đó sẽ bị thoát.
Phiên bản tập tin của System.dll trên máy với VS2012 là 4.0.30319.17929
Phiên bản tập tin của System.dll trên máy chủ xây dựng là 4.0.30319.236
Lờ đi những giá trị của lý do tại sao chúng tôi sử dụng uri.ToString()
, những gì chúng tôi đang thử nghiệm và mọi công việc tiềm năng xung quanh. Bất cứ ai có thể giải thích lý do tại sao hành vi này dường như đã thay đổi, hoặc là một lỗi này?
Chỉnh sửa, đây là phiên bả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());
}
}
}
Một chút điều tra thêm, nếu tôi nhắm mục tiêu NET 4.0 hoặc .NET 4.5 các cuộc thử nghiệm thất bại, nếu tôi chuyển đổi nó để NET 3.5 thì nó thành công.
Tôi biết rằng logic mệnh lệnh mà tôi đang làm một cái gì đó sai và sẽ không có một lỗi trong .NET, nhưng tôi chỉ không thể làm việc tại sao điều này xảy ra. –
Có lẽ là "bool check = @" http://www.example.org/test?helloworld=foo¶bar "== uri.ToString();' là sai, phải không? – t3hn00b
Có đó là sai –