2011-10-10 45 views
5

Tôi hiện đang viết một khung kiểm tra đơn vị trong các bài kiểm tra đơn vị tiêu chuẩn cuối được viết bằng Visual Studio. Framework hiện không hoạt động chính xác với accessors. Xem xét phương pháp thử sau:Tạo cá thể của lớp truy cập

[TestMethod()] 
public void TestMethod() 
{ 
     ExampleMethods_Accessor target = null; 
     target = new ExampleMethods_Accessor(); 
     target.SomeMethod(); 
} 

Trong ví dụ này, trình truy cập đã được tạo bởi Visual Studio. Các bài kiểm tra đơn vị hoạt động hoàn toàn tốt khi chạy bằng cách sử dụng môi trường thử nghiệm đơn vị của Visual Studio. Tuy nhiên, tôi muốn gọi TestMethod() từ bên trong Framework của tôi. Tại dòng "target = new ExampleMethods_Accessor()", ngoại lệ sau đây được ném:

Trình khởi tạo kiểu cho "Proband.ExampleMethods_Accessor" đã ném một ngoại lệ.

ngoại lệ Nội:

Không thể tải tập tin hoặc lắp ráp: Proband, Version = 1.0.0.0, Culture = trung tính, PublicKeyToken = null ...

Có ai có ý tưởng về cách Microsoft Đơn vị kiểm tra Framework gọi thử nghiệm đơn vị? Tôi đã nghĩ rằng nó có thể là do thiếu đối tượng TestContext. Đây là "null" trong trường hợp của tôi. Khi bắt đầu kiểm thử đơn vị trong Visual Studio, đối tượng TestContext chứa rất nhiều thông tin. Nó có thể được, mà tôi cần phải khởi tạo nó đúng cách? Làm thế nào nó sẽ cần phải được khởi tạo?

Cảm ơn tất cả sự giúp đỡ, Christian

EDIT:

tôi vẫn tiếp tục thử nghiệm với các cách accessors đang làm việc. Tôi đã sử dụng ILSpy để xem mã nào đang được tạo ra trong Proband_Accessor.dll. Nó chỉ ra rằng các chỉ dẫn gây ra ngoại lệ là:

SomeClass_Accessor.m_privateType = new PrivateType("Probant, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Probant.SomeClass"); 

tôi sửa đổi mã kiểm tra đơn vị của tôi là như thế này (chỉ dành riêng cho thử nghiệm):

[TestMethod()] 
    [DeploymentItem("Proband.dll")] 
    public void SomeMethodTest() 
    { 
     ExampleMethods_Accessor target = null; 
     ExampleMethods c = null; 

     try 
     { 
      Assembly.Load("Proband, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); // this works fine 
      PrivateType tx = new PrivateType(typeof(ExampleMethods)); // this works fine as well (also without loading the assembly) 

      PrivateType t = new PrivateType("Proband, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Proband.ExampleMethods"); // this causes the exception 

      c = new ExampleMethods(); // this works fine 
      target = new ExampleMethods_Accessor(); // this causes the exception as well 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(); 
     } 
     int actual; 
     actual = target.SomeMethod(); 
    } 

Tôi hoàn toàn không hiểu, tại sao "mới PrivateType ("Proband, phiên bản ...." không hoạt động. có ai có ý tưởng?

+0

'cái Proband' lắp ráp là gì, và làm thế nào bạn đã cố gắng * * để làm cho nó có sẵn? –

+0

chính xác bạn đang viết gì? có vẻ như bạn đang sử dụng khung MSTest, từ việc bạn sử dụng [TestMethod]. Bạn đang viết một số loại thử nghiệm tùy chỉnh _runner_? –

+0

Oh Tôi xin lỗi vì đã không giải thích: Hội đồng ủng hộ là người có chứa mã cần được kiểm tra. ExampleMethods là một lớp bên trong assembly proband, chứa các phương thức riêng ("SomeMethod"). – Christian

Trả lời

1

tôi đã cố gắng tạo ra một cách giải quyết cho vấn đề này.

để AppDomain của tôi, tôi thêm một AssemblyResolv eEventHandler:

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler); 

xử lý sự kiện này có chứa đoạn mã sau:

private Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) 
    { 
     if(args.Name == "Proband, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null") 
     { 
      // resolving correct assembly of type under test 
      return typeof(ExampleMethods).Assembly; 
     } 
     else 
     { 
      return null; 
     } 
    } 

Bây giờ dòng mã "target = mới ExampleMethods_Accessor();" hoạt động tốt và trả về đối tượng accessor đúng.

Tôi vẫn không hiểu, tại sao Hội không thể được giải quyết tự động.

Thậm chí nếu nó là rất không chắc rằng bất cứ ai cũng có cùng một vấn đề: Tôi hy vọng câu trả lời này sẽ giúp người :)

0

Tôi không làm bất cứ điều gì gần như phức tạp, nhưng tôi đã có:

  1. web dự án ứng dụng sử dụng .NET 3.5 dự án Cấu hình
  2. sử dụng NET 3.5
  3. dự án thử nghiệm sử dụng NET 3,5

tôi đã nhận được ngoại lệ BadImageFormat tương tự khi cố gắng chạy một kiểm tra đơn vị sử dụng một accessor.

tôi thấy đường dẫn sau:

http://connect.microsoft.com/VisualStudio/feedback/details/677203/even-after-installing-vs2010-sp1-unit-tests-targeting-3-5-framework-fail-if-they-are-using-private-accessor#details

Các công việc xung quanh thứ hai giải quyết vấn đề của tôi. Tôi đã thay đổi dự án thử nghiệm để nhắm mục tiêu .NET 4.0 và nó hoạt động.

+0

Cảm ơn bạn đã nhập liệu, tôi sẽ thử với phiên bản thử nghiệm .NET 4.0. – Christian

0

Tôi vừa gặp sự cố chính xác này và đó là vì tôi đã xóa thuộc tính DeploymentItem khỏi phương pháp thử nghiệm. Khi tôi thêm nó một lần nữa, tôi không còn gặp lỗi trên máy xây dựng nữa.

[TestMethod] 
[DeploymentItem("FedImportServer.dll")] // ** This is necessary for the build machine. ** 
public void SourceFileStillExistsAfterProcessingFails() 

Lưu ý: Tôi chưa bao giờ gặp lỗi khi chạy cục bộ.

Đây là lỗi:

Test method FedImportTests.FedImportServiceHostTest.FileNoLongerExistsAfterSucessfulProcessing threw exception: System.TypeInitializationException: The type initializer for 'FedImportServer.Processing.FileProcessor_Accessor' threw an exception. ---> System.IO.FileNotFoundException: Could not load file or assembly 'FedImportServer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.

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