2015-07-29 20 views
20

tôi thấy rằng một trong những thử nghiệm của tôi trôi qua trong VS2013 được thất bại trong VS2015, các thử nghiệm gọi một dịch vụ bao gồm trong số những thứ khác một cuộc gọi đến Console.Clear();"Việc xử lý không hợp lệ" ngoại lệ trong Visual Studio 2015 Á hậu kiểm tra

để tìm hiểu whats going on tôi đã thực hiện một thử nghiệm đơn vị đơn giản

[TestMethod] 
    public void ExampleTest() 
    { 
     Console.Clear(); 
    } 

thử nghiệm này đi trong visual studio 2013 nhưng năm 2015 tôi nhận được lỗi sau:

Test Name: ExampleTest Test FullName: solution.Common.Test.CacheManagerTest.ExampleTest Test Source: C:\solution.Common.Test\CacheManagerTest.cs : line 34 Test Outcome: Failed Test Duration: 0:00:00.3015003

Result StackTrace: at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.Console.GetBufferInfo(Boolean throwOnNoConsole, Boolean& succeeded) at System.Console.Clear()
at sol.Common.Test.CacheManagerTest.ExampleTest() in C:\solution.Common.Test\CacheManagerTest.cs:line 35 Result Message:
Test method Alexandria.Common.Test.CacheManagerTest.ExampleTest threw exception: System.IO.IOException: The handle is invalid.

Tôi hiểu rằng thiết kế xấu cho dịch vụ của tôi không thành công nếu nó không được bàn điều khiển gọi. Lý do tôi đặt câu hỏi này là để hiểu tại sao điều này không thành công trong phiên bản mới của Visual Studio. Đây có phải là hành vi dự định không? Những gì đã thay đổi?

Tôi không thấy bất kỳ điều gì rõ ràng trong nhật ký thay đổi có vẻ liên quan đến điều này.

Chỉnh sửa: Tôi gọi Console.clear từ dll

Microsoft\Framework.NETFramework\v4.5.1\mscorlib.dll

Chỉnh sửa sau 2:

hình ảnh của testproject tính trong cả hai hãng visual both visual studios

+0

Không. Đối với tôi điều này không thành công trên Visual Studio 2010. Bạn có thể kiểm tra lại trong ** VS2013 ** Nhấp chuột phải vào dự án của bạn, chọn Properties -> Chọn tab ứng dụng -> Kiểm tra kiểu đầu ra. Nó có nói thư viện lớp học không? – gideon

+0

@gideon yes đó là thư viện lớp học http://i.imgur.com/1Vedgyd.png Tôi đang sử dụng Microsoft Visual Studio Professional 2013 Phiên bản 12.0.31101.00 Cập nhật 4 – mmilan

+0

Điều đó thật kỳ lạ. Nó sẽ phá vỡ, vì không có giao diện điều khiển có sẵn khi nó là một thư viện lớp. Nó có hoạt động và xóa giao diện điều khiển không? – gideon

Trả lời

14

Những thay đổi trong VS2015 là khá rõ ràng, sử dụng Test> Debug> All Tests để xem thông tin chi tiết. Bạn có thể thấy rằng nó bây giờ có một quy trình kiểm tra máy chủ mới, tên của nó là TE.ProcessHost.Managed.exe, được lưu trữ trong thư mục C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TestWindow.

Phiên bản trước của VS đã sử dụng một máy chủ lưu trữ khác, vstest.executionengine.exe. Một thay đổi đáng chú ý trong máy chủ thử nghiệm mới là nó không còn là một chương trình chế độ điều khiển. Một cái gì đó bạn có thể nhìn thấy bằng cách chạy Dumpbin.exe/tiêu đề trên exe.

Một cách khác để xem sự cố cơ bản là với Trình quản lý tác vụ. Lưu ý cách chạy thử nghiệm trong phiên bản VS cũ hơn gây ra quy trình conhost.exe để được thêm. Đây là quá trình sở hữu cửa sổ bảng điều khiển cho ứng dụng chế độ bảng điều khiển. Một vấn đề tôi đã thấy trước đây là quá trình này có xu hướng bị rò rỉ, không chấm dứt khi kiểm tra hoàn thành. Thêm bao giờ conhost.exe trường hợp, tại một điểm nghiên cứu vấn đề này tôi đã có 12 người trong số họ đang chạy. Có lẽ những thay đổi trong VS2015 có nghĩa là giải quyết vấn đề đó.

Về mặt kỹ thuật, bạn có thể định cấu hình phép thử đơn vị với a .runsettings file và sử dụng phần tử <ForcedLegacyMode> để buộc quá trình lưu trữ thử nghiệm cũ được sử dụng. Tuy nhiên, điều này không ảnh hưởng đến kết quả của thử nghiệm này, có vẻ như họ đã giải quyết vấn đề này theo nhiều cách.

Đó là một số tiền hợp lý để đoán, tôi khuyên bạn nên sử dụng connect.microsoft.com để gửi báo cáo phản hồi. Bạn có thể trích dẫn câu hỏi này để tham khảo.


Trong khi đó, bạn có thể xem xét giải pháp thay thế. Lưu ý rằng Console.Clear() nói chung là một nhà sản xuất gặp sự cố, nó cũng sẽ không hoạt động bình thường khi đầu ra của ứng dụng chế độ bảng điều khiển được chuyển hướng. Rất dễ thực hiện từ lời nhắc dòng lệnh với toán tử >. Đó là lý do cuối cùng nó thất bại trong một bài kiểm tra đơn vị. Bạn sẽ muốn làm cho mã đàn hồi để nó có thể hoạt động đúng cả trong sản xuất và trong một thử nghiệm đơn vị.Như thế này:

if (!Console.IsOutputRedirected) Console.Clear(); 

Cần nhắm mục tiêu .NET 4.5 trở lên. Bạn có thể sử dụng mã trong this SO post nếu bạn cần nhắm mục tiêu các phiên bản cũ hơn.