Đ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.
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
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
@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