2009-03-15 10 views
5

Khi tôi phát triển mã, tôi thường muốn kiểm tra đơn vị một số khối xây dựng của một lớp ngay cả khi chúng thường là riêng tư. Nếu thử nghiệm đơn vị của tôi nằm trong dự án, tôi có thể sử dụng "Friend" để thực hiện điều này và vẫn giữ các chức năng riêng tư để sử dụng bình thường. Nhưng tôi thà di chuyển các bài kiểm tra NUnit của mình vào (các) dự án riêng biệt của họ. Làm thế nào để đạt được hiệu quả mà tôi đang tìm kiếm?Làm cách nào để kiểm tra đơn vị chức năng riêng tư từ một dự án riêng biệt trong VB .NET?

Trả lời

11

Bạn không thể (dễ dàng) kiểm tra tin phương pháp từ một dự án khác nhau, nhưng nó khá phổ biến để kiểm tra phương pháp nội bộ (Friend trong VB) từ một dự án thử nghiệm sử dụng InternalsVisibleToAttribute. Điều này làm cho Friend thành viên có thể truy cập được vào một hội đồng khác.

Rõ ràng đây là mới trong VB 9 mặc dù nó đã có sẵn trong C# 2 ... không hoàn toàn chắc chắn lý do tại sao, nhưng this blog post from Bart de Smet đưa ra một ví dụ nhanh chóng.

Lưu ý rằng nếu hội đồng sản xuất của bạn được ký, hội đồng kiểm tra của bạn cũng sẽ cần được ký và bạn sẽ phải chỉ định khóa công khai trong các đối số InternalsVisibleToAttribute. Xem this Stack Overflow answer để biết thêm chi tiết.

+2

Là tại sao nó là mới trong VB9, đó là một chi phí/lợi ích thương mại giảm. VB có một cách khác nhau để giải quyết tên hơn C# và InternalsVisibleTo rất nhiều phức tạp tra cứu tên. Đó là quá tốn kém cho VB8 và do đó đã giảm xuống VB9. Chúng tôi đang thực sự thực hiện thêm thay đổi xung quanh độ phân giải tên cho (tiếp) – JaredPar

+0

(tiếp) tài khoản cho điều này trong VB10. – JaredPar

+0

cảm ơn câu trả lời này –

3

Bạn có thể sử dụng Phản chiếu để gọi các phương thức riêng tư. Có rất nhiều mẫu để làm điều này.

+0

Và đây là cái đã giúp tôi nhiều nhất: http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx – demoncodemonkey

1

Từ tìm kiếm google nhanh chóng: http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx

Những điều cơ bản: (điều này được dán từ trang web của dự án mã liên kết ở trên)

 public static object RunStaticMethod(System.Type t, string strMethod, 
    object [] objParams) 
    { 
     BindingFlags eFlags = 
     BindingFlags.Static | BindingFlags.Public | 
     BindingFlags.NonPublic; 
     return RunMethod(t, strMethod, 
     null, aobjParams, eFlags); 
    } //end of method 

    public static object RunInstanceMethod(System.Type t, string strMethod, 
    object objInstance, object [] aobjParams) 
    { 
     BindingFlags eFlags = BindingFlags.Instance | BindingFlags.Public | 
     BindingFlags.NonPublic; 
     return RunMethod(t, strMethod, 
     objInstance, aobjParams, eFlags); 
    } //end of method 

    private static object RunMethod(System.Type t, string 
    strMethod, object objInstance, object [] aobjParams, BindingFlags eFlags) 
    { 
     MethodInfo m; 
     try 
     { 
      m = t.GetMethod(strMethod, eFlags); 
      if (m == null) 
      { 
       throw new ArgumentException("There is no method '" + 
        strMethod + "' for type '" + t.ToString() + "'."); 
      } 

      object objRet = m.Invoke(objInstance, aobjParams); 
      return objRet; 
     } 
     catch 
     { 
      throw; 
     } 
    } //end of method