2009-01-07 32 views
5

Tôi muốn kiểm tra xem lớp học có EventHandler được gán cho một sự kiện hay không. Về cơ bản tôi đang sử dụng IoC Container của tôi để treo EventHandlers cho tôi, và tôi muốn kiểm tra xem họ có được chỉ định đúng không. Vì vậy, thực sự, tôi đang thử nghiệm cấu hình IoC của tôi.Kiểm tra xem sự kiện có EventHandler được gán

[Test] 
public void create_person_event_handler_is_hooked_up_by_windsor() 
{ 
    IChangePersonService changePersonService = IoC.Resolve<IChangePersonService>(); 

    // check that changePersonService.PersonCreated has a handler attached 
} 

Tôi không chắc chắn cách kiểm tra changePersonService.PersonCreated có bất kỳ điều gì liên quan đến nó.

Bất kỳ ý tưởng nào?

Cảm ơn.

Trả lời

2

Không đặt câu hỏi về những gì bạn giả vờ với điều này, cách duy nhất để kiểm tra và liệt kê các sự kiện đã đăng ký là nếu bạn đăng ký chúng trong bộ sưu tập của riêng bạn.

Xem ví dụ này:

public class MyChangePersonService : IChangePersonService 
{ 
    private IList<EventHandler> handlers; 

    private EventHandler _personEvent; 

    public event EventHandler PersonCreated 
    { 
     add 
     { 
      _personEvent += value; 
      handlers.Add(value); 
     } 

     remove 
     { 
      _personEvent -= value; 
      handlers.Remove(value); 
     } 
    } 

    public IList<EventHandler> PersonEventHandlers { get { return handlers; } } 

    public MyChangePersonService() 
    { 
     handlers = new List<EventHandler>(); 
    } 

    public void FirePersonEvent() 
    { 
     _personEvent(this, null); 
    } 
} 

Sau đó, bạn có thể truy cập vào bộ xử lý đã đăng ký với prop PersonEventHandlers.

Bạn có thể triển khai một cái gì đó như thế này không?

+0

Cảm ơn Bruno, tôi nghĩ đó là những gì tôi sẽ làm. – mattcole

0

Có vẻ như bạn đang cố gắng prod một số thông tin trong đối tượng của mình để khẳng định là một điều hay cách khác. Lưu ý rằng điều này không nhất thiết phải là thử nghiệm đơn vị, bởi vì bạn không phải là chức năng thử nghiệm.

Nếu bạn phải kiểm tra điều này, có vẻ như bạn sẽ cần mở API công khai theo số IChangePersonService để nhận trình xử lý sự kiện đã đăng ký.

1

Có vẻ như tôi đang cố gắng thử đơn vị Castle Windsor. Vì nó có lẽ đã có bài kiểm tra đơn vị, tôi nghĩ rằng đây là một sự lãng phí công sức. Bạn nên kiểm tra tốt hơn rằng đối tượng của bạn tăng các sự kiện thích hợp vào đúng thời điểm (có thể bằng cách đăng ký một đối tượng giả như là trình xử lý sự kiện).

0

Đây không phải là thử nghiệm đơn vị thực sự, đây là thử nghiệm tích hợp. Và tôi không thử nghiệm Castle Windsor, mà đúng hơn là cấu hình của tôi. Tôi đang thử nghiệm rằng tất cả các lớp học tách rời của tôi đang được nối lại như tôi dự định. Cuối cùng, tôi muốn kiểm tra xem cấu hình của tôi có đang hooking các sự kiện đúng như tôi muốn hay không, nhưng tôi không chắc chắn rằng C# sẽ cho phép tôi mà không thay đổi API của tôi như Yuval cho biết.

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