2011-06-17 25 views
5

Khi sử dụng các biến thể lớp học, các hợp đồng Mã có vẻ như đang tiêm mã ở mọi nơi. Cụ như thế nàyHợp đồng Moq và Mã số

[ContractClassFor(typeof(IX))] 
interface IXContract 
{ 
    [ClassInvariant] 
    void Invariant() { ... } 
} 

[ContractClass(typeof(IXContract))] 
interface IX { event EventHandler b; } 

var a = new Mock<IX>(); 

a.Raise(x => x.b += null); 

Không với một thông báo lỗi

Could not locate event for attach or detach method Void $InvariantMethod$(). 

Bất cứ ai cũng biết của một giải pháp?

+0

Chúng ta đang xem chính xác điều gì? –

+0

Đã thêm một số mã khác – jameszhao00

+0

Thuộc tính 'ClassInvariant' đó đến từ đâu? – Jonn

Trả lời

3

kiểm tra đơn vị này "đi" khi chạy mà không có ngoại lệ tạo:

[ContractClassFor(typeof(IX))] 
class IXContract 
{ 
    [ContractInvariantMethod] 
    void Invariant() { } 
} 

[ContractClass(typeof(IXContract))] 
public interface IX { event EventHandler b; } 

/// <summary> 
/// Summary description for UnitTest1 
/// </summary> 
[TestClass] 
public class UnitTest1 
{ 
    public void MyTest() 
    { 
     var a = new Mock<IX>(); 

     a.Raise(x => x.b += null); 
    } 
} 

Tôi không hoàn toàn chắc chắn những gì đang xảy ra và làm thế nào bạn đang biên soạn (hoặc sao chép) ở trên, nhưng tôi không nghĩ rằng bạn có thể có thuộc tính "ContractClassFor" trang trí giao diện và bạn chắc chắn không thể triển khai "{...}" trong giao diện. Bạn cũng cần phải làm cho giao diện IX của bạn công khai để thử nó (hoặc khác nội bộ với InternalsVisibleTo() lâu đài proxy trong tài sản của bạn).

Hy vọng điều này sẽ hữu ích, nhưng vui lòng cập nhật bài đăng của bạn bằng mã mới nếu điều này không dẫn bạn đến những gì bạn đang muốn làm.

+0

Có một vài điều sai với các thay đổi của bạn. IXContract phải trừu tượng, không chỉ nội bộ. Phương pháp bất biến không thích hợp ở đó. Có một điều không thực sự khả thi khi bạn đang kiểm tra các thuộc tính và các trường của implant, và bạn không biết mọi người sẽ cấy ghép giao diện như thế nào. Ngoài ra, lớp hợp đồng này KHÔNG phải là sự thực hiện thực tế, nó ở đó dưới dạng keo để cho phép các hợp đồng trên các giao diện. Ngoài ra, lớp PHẢI thực hiện giao diện IX. Xem câu trả lời của tôi cho những gì nó sẽ như thế nào. – Andy

2

Mã của bạn không chính xác. Nó sẽ giống như sau:

[ContractClassFor(typeof(IX))] 
internal abstract class XContract : IX 
{ 
    // Invariants belong on your actual implemenation; interfaces don't dictate implemenation so this isn't appropariate here. 
    // [ ContractInvariantMethod] 
    // void Invariant() { ... } 

    public event EventHandler b { get { return default(EventHandler); } set { }} 
} 

[ContractClass(typeof(XContract))] 
interface IX { event EventHandler b; } 

var a = new Mock<IX>(); 

a.Raise(x => x.b += null); 

Lưu ý rằng lớp Hợp đồng là Tóm tắt nội bộ và bây giờ nó sẽ thực hiện giao diện của bạn. Các bất biến không phải là appropiate ở đó, vì đó là cho các chi tiết implemenation; bạn không biết làm thế nào mọi người sẽ thực hiện giao diện của bạn, do đó, không đặt nó ở đó. Ngoài ra thuộc tính cho các phương pháp bất biến là ContractInvariantMethodAttribute.

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