2009-07-31 16 views
16

Tôi đang nhảy vào đơn vị thử nghiệm Visual-Studio 2008 cách, và tôi tự hỏi cách tốt nhất để thực hiện truy cập chéo class lắp ráp chéo cho mục đích thử nghiệm là gì.Làm thế nào để truy cập vào các lớp học trong một hội đồng khác cho mục đích thử nghiệm đơn vị?

Về cơ bản, tôi có hai dự án trong một giải pháp:

  1. MyProject (C#)
  2. MyProjectTests (C Dự án # Kiểm tra)

Mọi thứ trong MyProject hiện có khả năng tiếp cận mặc định, mà nếu tôi gọi lại chính xác nghĩa là mọi thứ có hiệu quả là internal. Tôi chủ yếu tìm cách thử nghiệm ở cấp độ class, nhưng có một vài sự tham gia delegates.

Có thể sẽ có một API bên ngoài trong tương lai, nhưng tôi khoảng 20% ​​cách để làm nổi bật (ít nhất là trên giấy) và tôi nhận được khá nhiều phân đoạn mã hơn trên đầu trang này lõi chưa được kiểm tra. Theo đó tôi muốn thực hiện một số thử nghiệm ngay bây giờ, trước khi ứng dụng hoàn thành đủ cho thử nghiệm chức năng truyền thống (đọc: xấu và/hoặc lười) và chắc chắn trước khi phiên bản n + 1 API bên ngoài đang hoạt động.

Ngoài câu trả lời thẳng, ví dụ về giải pháp sẽ được đánh giá cao.

+1

Để chặn trước câu hỏi tiếp theo của bạn - tại sao không lắp ráp thử nghiệm phải có chữ ký nếu lắp ráp thử nghiệm được ký kết? - đây là bài viết của tôi về chủ đề đó: http://blogs.msdn.com/ericlippert/archive/2009/06/04/alas-smith-and-jones.aspx –

Trả lời

28

Bạn có thể sử dụng thuộc tính mức lắp ráp InternalsVisibleToAttribute để đạt được điều này.

Thêm

[assembly:InternalsVisibleTo("MyProjectTests")] 

để AssemblyInfo.cs trong lắp ráp MyProject của bạn.

+0

Với tham chiếu khóa tên mạnh mẽ phù hợp, tất nhiên - bạn mạnh mẽ đặt tên cho hội đồng của bạn, phải không bạn. –

3

Bạn cần phải thêm

[assembly:InternalsVisibleTo("Unit.Tests.Assembly")] 

để AssemblyInfo.cs của "MyProject (C#)" của bạn. Sau đó, cho phép thử nghiệm của bạn truy cập các phương pháp nội bộ để kiểm tra.

+2

liên kết bị hỏng vui lòng sửa lỗi – Darcy

1

Hình như bạn cần InternalsVisibleToAttribute

Tuy nhiên tôi khuyên bạn nên chống lại phương pháp này - kiểm tra các lớp học nội bộ của bạn thông qua giao diện công cộng hoặc API.

+0

Vấn đề là những người chưa tồn tại; và sẽ không lâu đâu. Đó là một dự án lớn (hoặc, nó sẽ được hoàn thành). –

+0

Sự cố với cách tiếp cận bên trong là bạn có thể gặp phải tình huống mà bạn đã thực hiện nội bộ .. nhưng API bên ngoài không cắm như mong đợi - bởi vì có sự ngắt kết nối trong sự hiểu biết. Thông tin phản hồi đến sau nhiều .. khi nó là tốn kém hơn để khắc phục. – Gishu

+0

Đúng, nhưng đưa ra kiểm tra kỹ lưỡng cho đến khi ứng dụng được "thực hiện" chỉ là cầu xin cho sự cố. Ngoài ra, API bên ngoài có thể sẽ có dạng tự động hóa hành động của người dùng và trích xuất dữ liệu thay vì mở rộng chức năng; khó khăn hơn nhiều so với API plugin đầy đủ. –

3

Bạn có thể kiểm tra các phương pháp nội bộ, bằng cách thêm một thuộc tính đến AssemblyInfo.cs cho dự án chính của bạn, cho phép truy cập đến các phương pháp nội bộ để một assembly có tên là:

[assembly: InternalsVisibleTo ("MyProjectTestsNameSpace.MyProjectTests ")]

Thêm thông tin là here

+0

bị hỏng :( – User193452

0

Mặc dù [InternalsVisibleTo] là cách hợp lý nhất IMO, có ít nhất 2 cách khác để đi về điều này:

  • Bằng cách sử dụng Reflection

    var method = instance.GetType().GetMethod(
        methodName, BindingFlags.NonPublic | BindingFlags.Instance, 
        null, paramTypeArray, null); 
    return method.Invoke(instance, parameters); 
    

Sự cố với cách tiếp cận này là nếu tên phương pháp hoặc chữ ký thay đổi, kiểm tra đơn vị sẽ bắt đầu thất bại tại thời gian chạy, trong khi [InternalsVisibleTo] sẽ dễ dàng được chọn thay đổi đột phá này tại thời gian biên dịch.

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