2013-04-05 33 views
5

Tôi có một lớp công khai (TargetContainerDto) có 2 thuộc tính nội bộ. Một enum và một loại có chứa một giá trị từ enum đó.Phản ánh đối với các thuộc tính bên trong kiểm tra đơn vị

Tôi đang cố thử nghiệm đơn vị loại, nhưng tôi đang gặp sự cố.

internal enum TargetContainerType 
{ 
    Endpoint, 
    Group, 
    User, 
    UserGroup 
} 


internal TargetContainerType Type { get; set; } 

Đây là mã phản chiếu của tôi trong lớp học thử nghiệm của tôi

public void setType(TargetContainerDto t, int val) 
{ 
    BindingFlags bf = BindingFlags.NonPublic | BindingFlags.Instance; 
    PropertyInfo pi = t.GetType().GetProperty("Type", bf); 
    pi.SetValue(t, val, null); 
} 

public TargetContainerDto setTypeTo(TargetContainerDto t, int val) 
{ 
    setType(t, val); 
    return t; 
} 

TargetContainerDto có tính hơn Type, nhưng họ là công khai để thử nghiệm chúng là tốt. iconURL là một chuỗi được xác định trong TargetContainerDto tùy thuộc vào loại đó là gì. Đây là thử nghiệm của tôi:

public void DefaultSubGroupIcon() 
{ 
    var o1 = new TargetContainerDto 
    { 
     Id = 1234, 
     DistinguishedName = "1.1.1.1", 
     SubGroup = "test", 
    }; 
    setType(o1, 3); 
    Assert.AreEqual(o1.IconUrl, "/App_Themes/Common/AppControl/Images/workstation1.png"); 
} 

Tôi gọi setTypeĐể thử phương pháp khi tôi cần đặt kiểu chữ, nhưng tôi nhận được MethodAccessException. Tôi nghĩ rằng đó là bởi vì tôi không có quyền truy cập vào enum. Làm thế nào tôi có thể truy cập enum thông qua sự phản ánh?

Cảm ơn

+3

Chỉ cần tò mò - bạn đã bao giờ xem xét ngừng sử dụng phản xạ trong các bài kiểm tra để truy cập trạng thái nội bộ của các đối tượng trong thử nghiệm và thiết kế lại ứng dụng của bạn một chút? –

+0

Bạn có thể đăng ngoại lệ không? Loại có giá trị được đặt trước hoặc là giá trị rỗng không? – Akku

+0

Nhân tiện, tôi vừa thử nghiệm kịch bản của bạn và nó hoạt động tốt. Bạn có thể vui lòng cung cấp thêm chi tiết, không chỉ chi tiết ngoại lệ, nhưng định nghĩa lớp ** TargetContainerDto ** của bạn? Lớp cơ sở cho nó là gì? –

Trả lời

1

này tôi đồng ý với ý kiến ​​khác mà bạn nên cố gắng thiết kế lại để tránh kiểm tra trạng thái nội bộ, tuy nhiên tôi đã làm thử mã của bạn và nó hoạt động tốt cho tôi (.Net 4 trên VS2012).

thư viện lớp của tôi được kiểm tra như sau:

using System; 

namespace ClassLibrary 
{ 
    internal enum TargetContainerType 
    { 
     Endpoint, 
     Group, 
     User, 
     UserGroup 
    } 

    public class TargetContainerDto 
    { 
     internal TargetContainerType Type 
     { 
      get; 
      set; 
     } 

     public void Print() 
     { 
      Console.WriteLine(Type); 
     } 
    } 
} 

Và chương trình thử nghiệm (một ứng dụng Console) trông như thế này:

using System; 
using System.Reflection; 
using ClassLibrary; 

namespace Demo 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var test = new TargetContainerDto(); 
      setType(test, 1); 
      test.Print(); 
     } 

     public static void setType(TargetContainerDto t, int val) 
     { 
      BindingFlags bf = BindingFlags.NonPublic | BindingFlags.Instance; 
      PropertyInfo pi = t.GetType().GetProperty("Type", bf); 
      pi.SetValue(t, val, null); 
     } 
    } 
} 

này in ra Group, như mong đợi. Nếu chúng tôi có thể xác định sự khác biệt giữa mã này và mã thực tế của bạn, chúng tôi có thể tìm thấy sự cố.

+0

Xin chào, cảm ơn sự giúp đỡ. sự khác biệt duy nhất tôi có thể thấy là bạn có enum bên trong được khai báo bên ngoài lớp TargetContainerDto. Ngoài ra ứng dụng thử nghiệm của tôi là một bài kiểm tra đơn vị nhưng vẫn nên hành xử tương tự. – user966890

+0

nó làm việc cho tôi khi tôi đã thoát khỏi phương thức setTypeTo. Cảm ơn rất nhiều. Il đánh dấu bạn là câu trả lời như bạn là người duy nhất phản ứng trong sự kiện phản chiếu và không phải là những người thay thế. cảm ơn – user966890

7

Đánh lắp ráp của bạn với các thuộc tính InternalsVisibleTo và bạn không cần phải sử dụng phản ánh trong dll thử nghiệm của bạn.

ví dụ: trong tệp AssemblyInfo.cs trong dll ứng dụng của bạn, hãy thêm dòng sau:

[assembly:InternalsVisibleTo("TestAssembly")] 

xem here để biết thêm chi tiết.

+4

Hãy lưu ý rằng làm điều này sẽ ngăn chặn Phân tích mã phát hiện các nội dung không sử dụng. –

6

Bạn đặt câu hỏi sai. Câu hỏi hay hơn sẽ là:

Làm cách nào để ngừng kiểm tra trạng thái nội bộ của lớp học?

Nhưng, nếu bạn hoàn toàn cần cái này, có vài cách mô tả trong liên quan SO answer

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