2012-08-24 29 views
5

Dưới đây là một phần của thực hiện mã trong lớp cha:Làm thế nào để nâng cao một sự kiện trong một thử nghiệm sử dụng Moq?

handler.FooUpdateDelegate += FooUpdate(OnFooUpdate); 
protected abstract void OnFooUpdate(ref IBoo boo, string s); 

tôi có trong handler chế giễu phương pháp thử nghiệm:

Mock<IHandler> mHandler = mockFactory.Create<IHandler>(); 

này ...

mHandler.Raise(x => x.FooUpdateDelegate += null, boo, s); 

... không phải là đang làm việc. Nó nói:

System.ArgumentException: Không thể xác định sự kiện để đính kèm hoặc tách phương thức Void set_FooUpdateDelegate (FooUpdate).

Tôi muốn nâng cao OnFooUpdate để kích hoạt mã được kiểm tra ở lớp trẻ em.

Câu hỏi: Làm cách nào tôi có thể nâng cao quyền đại biểu (không phải là trình xử lý sự kiện chung) với Moq?

Nếu tôi đã bỏ lỡ điểm hoàn toàn, vui lòng mở rộng tôi.

Trả lời

8

Dường như bạn đang cố gắng nâng cao đại biểu thay vì một sự kiện. Có phải vậy không?

Mã của bạn có nằm dọc theo dòng này không?

public delegate void FooUpdateDelegate(ref int first, string second); 

public class MyClass { 
    public FooUpdateDelegate FooUpdateDelegate { get; set; } 
} 

public class MyWrapperClass { 

    public MyWrapperClass(MyClass myclass) { 
     myclass.FooUpdateDelegate += HandleFooUpdate; 
    } 

    public string Output { get; private set; } 

    private void HandleFooUpdate(ref int i, string s) { 
      Output = s; 
    } 

} 

Nếu vậy, sau đó bạn có thể trực tiếp gọi myClass FooUpdateDelegate như vậy

[TestMethod] 
public void MockingNonStandardDelegate() { 

    var mockMyClass = new Mock<MyClass>(); 
    var wrapper = new MyWrapperClass(mockMyClass.Object); 

    int z = 19; 
    mockMyClass.Object.FooUpdateDelegate(ref z, "ABC"); 

    Assert.AreEqual("ABC", wrapper.Output); 

} 

EDIT: phiên bản sử dụng giao diện Thêm

public interface IMyClass 
{ 
    FooUpdateDelegate FooUpdateDelegate { get; set; } 
}  

public class MyClass : IMyClass { 
    public FooUpdateDelegate FooUpdateDelegate { get; set; } 
} 

public class MyWrapperClass { 

    public MyWrapperClass(IMyClass myclass) { 
     myclass.FooUpdateDelegate += HandleFooUpdate; 
    } 

    public string Output { get; private set; } 

    private void HandleFooUpdate(ref int i, string s) { 
      Output = s; 
    } 

} 


[TestMethod] 
public void MockingNonStandardDelegate() 
{ 

    var mockMyClass = new Mock<IMyClass>(); 
    // Test fails with a Null Reference exception if we do not set up 
    // the delegate property. 
    // Can also use 
    // mockMyClass.SetupProperty(m => m.FooUpdateDelegate); 

    mockMyClass.SetupAllProperties(); 

    var wrapper = new MyWrapperClass(mockMyClass.Object); 

    int z = 19; 
    mockMyClass.Object.FooUpdateDelegate(ref z, "ABC"); 

    Assert.AreEqual("ABC", wrapper.Output); 

} 
+0

Great câu trả lời. Một điều tôi muốn đề cập là bạn có thể phải duy trì thuộc tính FooUpdateDelegate, bằng cách gọi mockMyClass.SetupAllProperties() – Eternal21

+1

@ Eternal21 The Mock đang sử dụng thực thi cụ thể thuộc tính từ MyClass, vì vậy nó hoạt động tốt. Nếu chúng ta chế nhạo một giao diện (nói, IMyClass), thì sẽ không có triển khai cụ thể nào và thiết lập thuộc tính trên mô hình sẽ là cần thiết. – AlanT

+0

Đó là chính xác trường hợp của tôi. – Eternal21

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