2012-01-31 36 views
13

Tôi đã đọc qua các câu hỏi về kiểm tra đơn vị với bộ hẹn giờ và luồng. Tôi tìm thấy câu hỏi SO về system.threading.timers thử nghiệm đơn vị, nhưng tôi cần phải đơn vị kiểm tra một system.timers.timer và một lớp wrapper dường như không làm việc khá trơn tru cho việc này.hệ thống thử nghiệm đơn vị.timers.timer

Tôi chỉ cần biết cách chế độ hẹn giờ và/hoặc thời gian hệ thống để kiểm tra đơn vị chống lại nó. Tôi không thể tìm thấy điều này ở bất cứ đâu trên google.

chỉnh sửa & cập nhật: Có nghĩa là nếu tôi trích xuất bộ hẹn giờ bằng cách gói nó như dưới đây, tôi có thể tạo bộ hẹn giờ và sử dụng chế nhạo để thay thế bằng bộ hẹn giờ khác. Phần liên quan là sau đó để có bộ đếm thời gian mà tôi đang tiêm vào thời gian chạy (bản gốc, không phải là một mô hình) và kiểm tra mã sự kiện đã trôi qua của nó.

+1

Thật khó để đề xuất điều gì đó vì bạn chưa cung cấp bất kỳ thông tin nào về trường hợp kiểm tra nào bạn muốn che và khối mã nào đại diện cho logic trong trường hợp kiểm tra. – sll

+3

Bạn cần kiểm tra bộ hẹn giờ hoặc kiểm tra mã được thực thi trong mỗi sự kiện? Nếu vậy, bạn có thể đặt logic đó vào một lớp khác và chỉ kiểm tra điều đó. Bạn có thể tin tưởng bộ hẹn giờ gọi nó. – ivowiblo

+0

@ivowiblo: Tôi không biết cách đánh dấu nhận xét của bạn là câu trả lời, nhưng tôi nghĩ đó là câu trả lời gần nhất với câu hỏi thực tế cho câu hỏi mà tôi có thể tìm thấy. – deltree

Trả lời

22

Điều gì khiến bạn không bao giờ gói này?

public interface ITimer 
{ 
    void Start(double interval); 
    void Stop(); 
    event ElapsedEventHandler Elapsed; 
} 

Đó là khá nhiều nhu cầu giao diện của bạn. Hãy xem cách này có thể đi (lưu ý rằng bạn có thể tất nhiên hiển thị thêm Timer tài sản, nhưng đó là khá nhiều thứ cơ bản mà nên là đủ):

public class MyTimer : ITimer 
{ 
    private Timer timer = new Timer(); 

    public void Start(double interval) 
    { 
     timer.Interval = interval; 
     timer.Start(); 
    } 

    public void Stop() 
    { 
     timer.Stop(); 
    } 

    public event ElapsedEventHandler Elapsed 
    { 
     add { this.timer.Elapsed += value; } 
     remove { this.timer.Elapsed -= value; } 
    } 
} 

Bây giờ, làm thế nào bạn sẽ sử dụng trong thử nghiệm của bạn (giả sử chúng tôi đang sử dụng FakeItEasy như chế giễu khuôn khổ của sự lựa chọn):

var timerFake = A.Fake<ITimer>(); 
var classUnderTest = new MyClass(timerFake); 

// tell fake object to raise event now 
timerFake.Elapsed += Raise.With<ElapsedEventArgs>(ElapsedEventArgs.Empty).Now; 

// assert whatever was supposed to happen as event response, indeed did 
Assert.That(classUnderTest.ReceivedEvent, Is.True); 

Ví dụ trên thực không kiểm tra mã điều đó xảy ra một lần sự kiện trên timer được nâng lên. Cân nhắc MyClass tìm kiếm như thế này:

public class MyClass 
{ 
    private ITimer timer; 

    public MyClass(ITimer timer) 
    { 
     this.timer = timer; 
     this.timer.Elapsed += TimerElapsedHandler; 
    } 

    public bool ReceivedEvent { get; set; } 

    private void TimerElapsedHandler(object sender, ElapsedEventArgs e) 
    { 
     ReceivedEvent = true; 
    } 
} 

Trong thử nghiệm, chúng tôi lực hẹn giờ để nâng cao khi chúng ta cần đến nó, và chúng tôi kiểm tra xem mã trong TimerElapsedHandler thực hiện, bằng cách khẳng định ReceivedEvent tài sản được thành lập. Trong thực tế, phương pháp này có thể làm nhiều hơn thế, nhưng điều đó sẽ chỉ thay đổi cách chúng ta làm khẳng định - ý tưởng vẫn như cũ.


Edit: Bạn cũng có thể thử Moles, một khuôn khổ cho phép bạn tạo ra giả của bất kỳ loại khung/phương pháp. Tuy nhiên, nếu mocking hẹn giờ là tất cả các bạn muốn, tôi muốn đi với cách tiếp cận wrapper.

+0

nếu tôi quấn nó theo cách này, làm cách nào tôi có thể kiểm soát sự kiện đã trôi qua và/hoặc giả lập đối tượng? – deltree

+0

@deltree: ý của bạn là gì * cách bạn có thể kiểm soát sự kiện *? Nếu bạn quấn nó theo cách này, bạn có thể giả lập nó giống như bất kỳ giao diện nào khác.Tôi sẽ thêm ví dụ đơn giản. –

+0

cảm ơn bạn vì điều này. Điều này gần hơn với những gì tôi thực sự nói và rõ ràng không phải những gì tôi muốn nói. Đây là một cách tuyệt vời để kiểm tra đơn vị mà bộ hẹn giờ được gọi, nhưng không phải là mã chạy khi nó được trôi qua. – deltree

2

Bạn cần kiểm tra bộ hẹn giờ hoặc kiểm tra mã được thực hiện trong mỗi sự kiện? Nếu vậy, bạn có thể đặt logic đó vào một lớp khác và chỉ kiểm tra điều đó. Bạn có thể tin tưởng bộ hẹn giờ sẽ gọi nó là ...

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