2014-05-07 16 views
15

Chúng tôi đang sử dụng Xunit để thử nghiệm. Chúng tôi đang chạy các thử nghiệm của mình thông qua Trình xây dựng thử nghiệm Visual Studio 2013 tích hợp, sử dụng plugin Xunit.Làm cách nào để tham khảo các tệp thử nghiệm từ các bài kiểm tra Xunit trong Visual Studio?

Vấn đề là một số thử nghiệm cần phải tham chiếu đến tệp trên hệ thống tệp. Dường như Xunit (hoặc VS Test Runner - không chắc chắn), sao chép các tập hợp, nhưng không phải bất kỳ tệp hỗ trợ nào trong thư mục bin, đến thư mục khác trước khi thực hiện các kiểm tra, do đó không tìm thấy tệp thử nghiệm của chúng tôi. [Khung MS kiểm tra xác định thuộc tính cho danh sách các tập tin được sao chép, nhưng xUnit không.]

Làm thế nào để hoặc vô hiệu hóa hành vi sao chép này, nếu không lập trình xác định vị trí bin/ thư mục gốc để lấy các tập tin?

Dường như hầu hết các giải pháp được đề xuất (kể cả trên trang web theo dõi lỗi Xunit) đề xuất lưu trữ tệp dưới dạng tài nguyên được nhúng thay vì tệp ‘sao chép luôn’. Tuy nhiên, điều này không phải lúc nào cũng thực tế, ví dụ: kiểm tra mã thao tác tệp và mã (trong một trường hợp) muốn có tệp cơ sở dữ liệu Sqlite.

Trả lời

24

Được rồi, điển hình, chỉ ngay sau khi tôi gửi câu hỏi, tôi tìm ra câu trả lời bản thân mình ...

Các ý chính là việc sao chép (Shadow Sao chép) của hội dường như được thực hiện bởi các khuôn khổ NET, không bởi Visual Studio hoặc bởi Xunit.

Chúng tôi đã sử dụng Assembly.Location để định vị tệp lắp ráp và do đó các tệp thử nghiệm. Tuy nhiên, điều này là sai, vì nó đã cho chúng ta vị trí của tập hợp Shadow-Copied thay vì bản gốc.

Thay vào đó, bạn nên sử dụng Assembly.CodeBase để tìm vị trí mã lắp ráp cơ sở. Tuy nhiên, đây là URL (Tệp), vì vậy, cần phải trích xuất đường dẫn từ URL. Mới (C#) mã trông như thế này:

var codeBaseUrl = new Uri(Assembly.GetExecutingAssembly().CodeBase); 
var codeBasePath = Uri.UnescapeDataString(codeBaseUrl.AbsolutePath); 
var dirPath = Path.GetDirectoryName(codeBasePath); 
return Path.Combine(dirPath, relativePath); 

... nơi relativePath là đường dẫn tương đối đến thư mục Bin\.

+0

Thật không may, giải pháp này không có tác dụng nữa, điểm nhập url là không thích hợp: System.IO.FileNotFoundException: Không thể tìm thấy tập tin 'C: \ Users \ [tên người dùng] \. Nuget \ packages \ microsoft.testplatform.testhost \ 15.0.0 \ lib \ sample.log'. – st78

+0

@ st78 Ý của bạn là ‘không hoạt động nữa” - Bạn đang sử dụng phiên bản .NET nào? Ý bạn là gì bởi “URL điểm nhập”? – andrewf

+1

Tôi đã gặp vấn đề tương tự như st78 khi sử dụng xunit và .net Core nhưng điều này đã giải quyết được vấn đề này. Tôi đã sử dụng Assembly.Location nhưng tôi đã có lỗi mà st78 đề cập đến. Sử dụng CodeBase đã giải quyết được vấn đề. – alas

2

Tôi đang chạy .Net Core 1.0 trên máy Mac. Assembly.GetExecutingAssembly không khả dụng. Tôi sử dụng mã sau để thay thế:

var location = typeof(YourClassName).GetTypeInfo().Assembly.Location; 
var dirPath = Path.GetDirectoryName(location); 
return Path.Combine(dirPath, relativePath); 

relativePath là đường dẫn liên quan đến thư mục DLL của bạn.

4

Sau một chút tìm kiếm, tôi đã tìm thấy giải pháp tại đây: https://msdn.microsoft.com/en-us/library/ms182475.aspx.

Riêng, bước đầu tiên đã đủ cho tôi:

Nếu họ là đặc trưng cho dự án một thử nghiệm, bao gồm họ các tập tin như nội dung trong dự án thử nghiệm Visual Studio. Chọn chúng trong Solution Explorer và đặt thuộc tính Copy to Output thành Copy if Newer.

liên quan đến đoạn mã sau:

var filename = "./Resources/fake.pdf" 
File.OpenRead(filename) 

The test project (note the Resource folder) Cfg of files in the resource folder

+0

Xem thêm: https://stackoverflow.com/questions/44374074/copy-files-to-output-directory-using-csproj-dotnetcore –

Các vấn đề liên quan