2012-02-21 34 views
5

Tôi đang cố gắng kiểm tra đơn vị chức năng riêng tư trong .net. Hàm riêng này trả về một tập hợp kiểu myClass, là một lớp nội bộ.InternalsVisibleTo có vẻ bị bỏ qua

Tôi đã sử dụng thuộc tính assembly InternalsVisibleTo, để loại myClass được biết đến với dự án Thử nghiệm của tôi.

Dưới đây là đoạn code tôi muốn thử nghiệm:

namespace MyProject 
{ 
    public class Class1 
    { 
     private List<myClass> myFunction() 
     { 
      return new List<myClass>(); 
     } 

     internal class myClass 
     { 
      public int MyProperty { get; set; } 
     } 
    } 
} 

[TestMethod()] 
[DeploymentItem("MyProject.dll")] 
public void myFunctionTest() 
{ 
    Class1_Accessor target = new Class1_Accessor(); 
    List<Class1_Accessor.myClass> expected = null; 
    List<Class1_Accessor.myClass> actual; 
    actual = target.myFunction(); 
    Assert.AreEqual(expected, actual); 
    Assert.Inconclusive("Verify the correctness of this test method."); 
} 

và thông tin lắp ráp tập tin của tôi:

[assembly: InternalsVisibleTo("MyProject.Test")] 

Vậy tại sao Visual Studio thiết lập các loại danh sách để Class1_Accessor.myClass từ myClass là biết cho dự án thử nghiệm của tôi?

Do đó tôi gặp lỗi thời gian chạy (không thể chuyển đổi loại myClass thành loại Class1_Accessor.myClass).

Vì myFunction là tư nhân, VisualStudio tạo ra đoạn mã sau (đó là tốt cho hầu hết của nó)

[Shadowing("MyProject.Class1")] 
public class Class1_Accessor : BaseShadow 
{ 
    protected static PrivateType m_privateType; 

    [Shadowing("[email protected]")] 
    public Class1_Accessor(); 
    public Class1_Accessor(PrivateObject value); 

    public static PrivateType ShadowedType { get; } 

    public static Class1_Accessor AttachShadow(object value); 
    [Shadowing("[email protected]")] 
    public List<Class1_Accessor.myClass> myFunction(); 

    [Shadowing("MyProject.Class1+myClass")] 
    public class myClass : BaseShadow 
    { 
     protected static PrivateType m_privateType; 

     [Shadowing("[email protected]")] 
     public myClass(); 
     public myClass(PrivateObject value); 

     [Shadowing("MyProperty")] 
     public int MyProperty { get; set; } 
     public static PrivateType ShadowedType { get; } 

     public static Class1_Accessor.myClass AttachShadow(object value); 
    } 
} 

Tuy nhiên, tôi không hiểu tại sao nó có chứa một định nghĩa mới của myClass, vì nó là một lớp nội bộ, không cần bất kỳ người truy cập nào. Đây là gốc rễ của vấn đề trong quan điểm của tôi.

+0

Bạn có thể muốn thêm thẻ 'mstest' để thu hút sự chú ý của những người có kinh nghiệm sử dụng Accessors. Tôi không chắc chắn nên xóa thẻ nào, vì vậy tôi không tự chỉnh sửa thẻ. Tôi không bao giờ quan tâm nhiều đến những người truy cập, vì vậy tôi có ít kinh nghiệm. (Hơn nữa, có một tình cảm mạnh mẽ rằng bạn không nên thử nghiệm các thành viên riêng tư, nếu bạn có một thành viên riêng không thể kiểm tra gián tiếp thông qua một công chúng, thì đó là dấu hiệu cho thấy bạn nên trích xuất một lớp riêng biệt cho logic đó.) – phoog

+0

cảm ơn , Tôi đã thêm thẻ. Kiểm tra các thành viên tư nhân hay không là một chủ đề hoàn toàn khác (mặc dù bạn là đúng). Tuy nhiên, tôi vẫn muốn thử nghiệm một chức năng đó. – Sam

+0

Về thử nghiệm của các thành viên tư nhân, thực tế là nó là một chủ đề hoàn toàn khác nhau là lý do tôi đặt nó trong ngoặc đơn. Và tất nhiên, luôn có những ngoại lệ có thể bảo vệ được với các nguyên tắc như vậy. Tôi sẽ thêm rằng khi tôi * có * thử nghiệm các thành viên riêng tư, tôi thường chỉ sử dụng sự phản chiếu - tôi thậm chí còn có một số phương thức trợ giúp cho mục đích (ví dụ: 'CallNonPublicMethod (string methodName)'). Tôi thấy rằng dễ dàng hơn để đối phó với các accessors - Tôi không bao giờ tìm ra cách để có được chúng tái sinh khi tôi sửa đổi các lớp họ đã shadowing. – phoog

Trả lời

0

InternalsVisibleĐể không hiển thị thành viên riêng tư với hội đồng người bạn. Nó hoạt động trên các thành viên/loại được đánh dấu là nội bộ. Kiểm tra tài liệu here.

Cập nhật

Hãy thử điều này (theo doc này): tái tạo lớp thử nghiệm của bạn, trong Create Unit Test hộp thoại, nhấp vào Cài đặt. Trong lĩnh vực Generation Cài đặt thử nghiệm chắc chắn rằng Honor InternalsVisibleTo Thuộc tính hộp kiểm được kiểm tra

+1

Vui lòng đọc lại câu hỏi của tôi. loại myClass IS Internal, NOT private. Nó chỉ là phương pháp tôi muốn kiểm tra đó là riêng tư. – Sam

+2

Trong mã của bạn, myFunction là riêng tư. – Fernando

+0

có, myFunction là riêng tư vì vậy nó là bình thường mà VisualStudio tạo ra một accessor cho nó. Tuy nhiên, myClass là Internal (và được đánh dấu là Friend trong tập tin assembly) nên tôi không hiểu tại sao VisualStudio lại tạo một accessor cho nó. – Sam

4

không thể chuyển đổi loại myClass gõ Class1_Accessor.myClass

nói tất cả những gì chúng ta cần phải biết: đơn giản - bạn có hai định nghĩa khác nhau của myClass. Các loại được sắp xếp theo cụm; các [InternalsVisibleTo(...)] làm cho nó có thể truy cập, nhưng ngoài ra: kinh doanh như bình thường.

Tìm tại sao/nơi bạn có một giây myClass, và một trong số:

  • disambiguate (namespace đủ điều kiện vv)
  • đổi tên một trong số họ
  • loại bỏ một trong số họ nếu họ có ý nghĩa giống điều, và được nhân đôi sai

Đây là giống hệt nhau là có:

namespace A { class Foo {} } 
namespace B { class Foo {} } 

đó là hai lớp hoàn toàn không liên quan được gọi là Foo và việc truyền giữa chúng sẽ không thành công.

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