47

Khi tôi chạy thử nghiệm đơn vị với Visual Studio nó hoạt động tốt, bởi vì nó chạy từ thư mục dự án, nơi tất cả các hội đồng được. Nhưng khi tôi chạy nó với resharper nó đi với lỗi trênResharper chạy UnitTest từ vị trí khác nhau

var services = Assembly.Load("SomeAssembly"); 

với lỗi

Không thể tải tập tin hoặc lắp ráp 'SomeAssembly' hoặc một trong phụ thuộc của nó. Hệ thống không thể tìm thấy một file nào đó ..

Vì vậy, tôi đã cố gắng

var path = Assembly.GetExecutingAssembly().Location; 

và nó không phải dự án một. Đó là

C: \ Users \ * UserName * \ AppData \ Local \ Temp \ TestResults \ ... \ Out \

và không có 'SomeAssembly'. Làm thế nào để cấu hình resharper một cách chính xác hoặc thu thập tất cả các hội đồng như Visual Studio không?

Nó xảy ra với các bài kiểm tra đơn vị nhưng không phải với NUnit, bất kỳ ý tưởng nào?

Trả lời

41

Tạo lại bản sao bóng bản sao để thử nghiệm theo mặc định. Nếu bạn tắt shadow-copy, nó sẽ chạy trong thư mục bin và kiểm tra sẽ được chuyển. Here là một số hướng dẫn về cách tắt.

+0

nó xảy ra với đơn vị xét nghiệm nhưng không phải với nunit, vì vậy những gì là khác nhau, bất kỳ ý tưởng? @tallseth – Roar

+0

Bạn có ý nghĩa gì khi nói "kiểm tra đơn vị, nhưng không phải với nunit"? Bạn có nghĩa là MSTest? Hoặc bạn có nghĩa là nó hoạt động với các giao diện điều khiển nunit runner, nhưng không phải với các plugin resharper, và tất cả các bài kiểm tra sử dụng khung nunit? – tallseth

+0

yeah, khi tôi chạy MSTest với resharper nó không thành công, nhưng khi tôi chạy MSTest với TestExplorer nó chạy ok và khi tôi chạy NUnit với resharper nó chạy tốt t00 – Roar

2

Bạn đang tải cụm động của mình bằng cách sử dụng Assembly.Load(). Có thể bạn đang thiếu một tham chiếu đến lắp ráp để tải. Nếu không, việc sao chép bóng có thể bỏ lỡ các hội đồng không được quan tâm.

Nếu bạn không muốn tham khảo các hội đồng này, hãy chắc chắn đưa chúng vào dự án của bạn và sao chép chúng vào thư mục đầu ra. Bạn có thể thực hiện việc này bằng cách đặt thuộc tính "Sao chép vào Thư mục Đầu ra" hoặc tạo bước tạo sau tùy chỉnh.

+0

Tôi tham khảo cần thiết lắp ráp, nó hoạt động tốt nếu NUnit thử nghiệm, nhưng không làm việc với mặc định Visual Studio kiểm tra Microsoft.VisualStudio.TestTools.UnitTesting; – Roar

+0

Không có ý tưởng cho đến nay. BTW: Chức năng Microsoft.VisualStudio.TestTools.UnitTesting thường được gọi là "MSTest". Có thể điều này giúp nhận được kết quả tìm kiếm tốt hơn. –

12

Tôi đã gặp phải vấn đề tương tự, người thử nghiệm thu thập lại thông tin đã ở trong C: \ trong khi các dll và giải pháp được tạo thực tế nằm trên ổ đĩa khác. Giải pháp là để bỏ chọn "Sử dụng Legacy Runner" trong trang cài đặt MSTest trong tùy chọn resharper.

+2

Cảm ơn người đàn ông, Bạn đã cứu tôi rất nhiều đau đớn! –

25

Trong documentation cho các thiết lập Gui Test Runner NUnit vừa thể hiện lưu ý sau đây về Shadow Copy

Lưu ý: Nếu bạn đang bị cám dỗ để vô hiệu hóa bản Shadow Copy để truy cập vào các file trong thư mục tương tự như lắp ráp của bạn , bạn nên biết rằng có những lựa chọn thay thế. Hãy xem xét sử dụng thuộc tính Assembly.Codebase thay vì Assembly.Location.

Dưới đây là ví dụ về cách sử dụng Assembly.Thuộc tính codebase

private string AssemblyLocation() 
    { 
     var assembly = Assembly.GetExecutingAssembly(); 
     var codebase = new Uri(assembly.CodeBase); 
     var path = codebase.LocalPath; 
     return path; 
    } 
+9

Đã vượt qua [TestContext.CurrentContext.TestDirectory] (https://github.com/nunit/docs/wiki/TestContext#testdirectory). Tôi đang sử dụng nó ngay bây giờ trong NUnit 3.0. Tôi không biết TestContext.CurrentContext.TestDirectory đã sẵn sàng như thế nào. – mcdon

+0

Bạn nên thêm giải pháp TestContext như một câu trả lời khác, vì nó là một câu trả lời xuất sắc theo đúng nghĩa của nó. Tôi sẽ bầu cho nó. Điều này đã làm việc trong NUnit 2.6 cũng vậy, và tôi nghĩ rằng phiên bản 2.x nói chung. – Holf

3

Hãy thử mã này để tải (xem bên dưới). Nó sẽ tra cứu các assembly độc lập với test runner.

private static string[] assemblyLookupPath = new[] 
{ 
    AppDomain.CurrentDomain.BaseDirectory, 
    Environment.CurrentDirectory, 
    Assembly.GetExecutingAssembly().Location 
}.Distinct().ToArray(); 

public static void Assembly Load(string fileName) 
{ 
    var filePath = assemblyLookupPath 
     .Select(f=>Path.Combine(f, fileName)) 
     .Where(File.Exists) 
     .FirstOrDefault(); 

    /*do here null checks and raise errors, write logs, etc*/ 

    return Assembly.LoadFrom(filePath) 
} 
1

Chỉ cần để hoàn thành câu trả lời rất hữu ích từ mcdon, sử dụng assembly.Location cho câu trả lời đúng theo MSFT 's giải thích:

Các codebase là một URL đến nơi chứa file đã được tìm thấy, trong khi Vị trí là đường dẫn từ nơi thực sự được tải. Ví dụ: nếu hội đồng được tải xuống từ internet, CodeBase của nó có thể bắt đầu bằng “http: //”, nhưng Vị trí của nó có thể bắt đầu bằng “C: \”. Nếu tệp bị sao chép bóng, Vị trí sẽ là đường dẫn đến bản sao của tệp trong thư mục sao chép bóng.

Bạn cũng nên biết rằng CodeBase không được đảm bảo được đặt cho các hội đồng trong GAC. Vị trí sẽ luôn được đặt cho các cụm được tải từ đĩa, tuy nhiên.

Vì vậy, tôi sẽ sử dụng như sau:

public static DirectoryInfo GetAssemblyDirectory() 
{ 
    var assembly = Assembly.GetExecutingAssembly();  
    return new DirectoryInfo(Path.GetDirectoryName(assembly.Location)); 
} 
0

gì giải quyết nó đối với tôi là để thiết lập các "Sao chép địa phương" bất động sản để thực về các tài liệu tham khảo nunit.framework.dll trong dự án thử nghiệm.

0

Nếu bạn đã chạy và xây dựng vấn đề sau khi vô hiệu hóa "shadow build" trước tiên bạn phải chọn "Làm sạch tất cả" từ tùy chọn Build và sau đó xây dựng dự án của bạn về "bóng Xây dựng" vô hiệu hóa

1

Chỉ cần thay đổi dòng điện thư mục

var dir = Path.GetDirectoryName(typeof(MySetUpClass).Assembly.Location); 
Environment.CurrentDirectory = dir; 

// or 
Directory.SetCurrentDirectory(dir); 

https://github.com/nunit/nunit/issues/1072

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