2015-01-30 18 views
26

Tôi có 3 dự án trong giải pháp C# của tôi.Cách hiển thị giao diện nội bộ cho Moq?

  • Signatures
  • cấu trúc
  • thử nghiệm

Chữ ký có giao diện công cộng và nội bộ. Ngoài ra, nó có

[assembly: InternalsVisibleTo("Structures")] 
    [assembly: InternalsVisibleTo("Tests")] 

trong AssemblyInfo.cs của.

cấu trúc có các lớp công chúng và nội bộ và

[assembly: InternalsVisibleTo("Tests")] 

trong AssemblyInfo.cs của.

Các xét nghiệm có nguồn tiếp theo:

<packages> 
    <package id="Moq" version="4.2.1409.1722" targetFramework="net45" /> 
    <package id="NUnit" version="2.6.4" targetFramework="net45" /> 
    <package id="NUnitTestAdapter" version="1.2" targetFramework="net45" /> 
</packages> 

như các gói NuGet trong packages.config.

Tôi đã viết một số kiểm tra đơn vị cho giao diện nội bộ từ Chữ ký và lớp nội bộ từ Cấu trúc. Chạy và có kết quả tiếp theo: ngoại lệ:

Loại chữ ký. Mặt phân cáchX không hiển thị với DynamicProxy. Không thể tạo proxy cho các loại không thể truy cập được. Đặt loại công khai, hoặc nội bộ và đánh dấu lắp ráp của bạn với thuộc tính [assembly: InternalsVisibleTo (InternalsVisible.ToDynamicProxyGenAssembly2)].

Có vẻ hợp lý. Tôi đã thêm [assembly: InternalsVisibleTo ("InternalsVisible.DynamicProxyGenAssembly2")] vào thông tin lắp ráp của các dự án Chữ ký và Cấu trúc. Chạy và có kết quả tiếp theo: ngoại lệ:

Nhập 'Castle.Proxies.IReminiscenceableDataTableProxy' từ assembly 'DynamicProxyGenAssembly2, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null' đang cố triển khai giao diện không thể truy cập.

Điều này là để trợ giúp, nhưng không. Chỉ thay đổi thông báo ngoại lệ.

Cách khắc phục sự cố của tôi?

Trả lời

51

Các đề nghị nhắn tin sửa chữa sử dụng một const/lĩnh vực tĩnh cho tên lắp ráp:

[assembly: InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)] 

Bạn sử dụng một chuỗi mà không tương ứng với tên lắp ráp:

[assembly: InternalsVisibleTo("InternalsVisible.DynamicProxyGenAssembly2")] 

Thay đổi nó để:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] 

Bạn có thể thấy tên lắp ráp thực tế (sẽ xuất hiện trong InternalsVisibleTo) trong thông báo lỗi của bạn:

Nhập 'Castle.Proxies.IReminiscenceableDataTableProxy 'từ assembly' DynamicProxyGenAssembly2 (...)

+0

Đây là điểm khác biệt quan trọng. Thông báo lỗi được đưa ra dẫn đến suy nghĩ rằng chúng ta cần tùy chọn thứ hai, nhưng tùy chọn thứ ba thực sự khắc phục nó. – SouthShoreAK

+4

Có vẻ như Dự án Castle cho thấy thành viên 'const' giống như một người trong thư, xem [' Castle.Core/Core/Internal/InternalsVisible.cs'] (https://github.com/castleproject/Core/blob/ master/src/Castle.Core/Core/Internal/InternalsVisible.cs), nhưng nó xuất hiện vì cách Castle Project được nhúng bên trong 'Moq.dll', lớp này trở thành không công khai khi nhìn xuyên qua Moq, và bởi vì nó không thể truy cập, nói rằng '[assembly: InternalsVisibleTo (Castle.Core.Internal.InternalsVisible.ToDynamicProxyGenAssembly2)]' sẽ không hoạt động. Vì vậy, bạn phải chuỗi ma thuật của riêng bạn. –

+0

điều này không hiệu quả đối với tôi, nói rằng các hội đồng được ký tên mạnh mẽ nhưng bao gồm một khóa công khai –

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