Hiện tại tôi đang trừu tượng hóa khái niệm về bộ tính giờ để lớp học của tôi cần có thể sử dụng bộ tính giờ giả trong các thử nghiệm hoặc triển khai khác nhau trong chế độ tác vụ (ví dụ: bộ hẹn giờ của bộ tạo luồng, bộ hẹn giờ luồng, v.v.). Vì vậy, tôi đã tạo ra giao diện này:Làm thế nào để kiểm tra đơn vị một lớp bộ đếm thời gian (mẫu bộ điều hợp)?
public interface ITimer : IDisposable
{
bool IsEnabled { get; }
bool IsAutoResetting { get; set; }
TimeSpan Interval { get; set; }
void Start();
void Stop();
event EventHandler IntervalElapsed;
}
Bây giờ tôi muốn tạo một wrapper mà điều chỉnh lớp System.Threading.Timer
và thực hiện các giao diện đó. Tôi muốn làm điều đó bằng cách sử dụng phát triển theo hướng thử nghiệm. Lớp học của tôi hiện nay có vẻ hơi như thế này:
public sealed class ThreadPoolTimer : ITimer
{
private readonly Timer _timer;
public bool IsEnabled { get; private set; }
public bool IsAutoResetting { get; set; }
public TimeSpan Interval { get; set; }
public ThreadPoolTimer()
{
Interval = this.GetDefaultInterval();
_timer = new Timer(OnTimerCallback);
}
public void Dispose()
{
_timer.Dispose();
}
public void Start()
{
}
public void Stop()
{
}
private void OnTimerCallback(object state)
{
OnIntervalElapsed();
}
public event EventHandler IntervalElapsed;
private void OnIntervalElapsed()
{
var handler = IntervalElapsed;
if (handler != null)
handler(this, EventArgs.Empty);
}
}
câu hỏi thực tế của tôi là: cách bạn sẽ viết bài kiểm tra đơn vị mô tả (soft real-time) yêu cầu đối với hành vi của Start
, Stop
và IntervalElapsed
?
Theo tôi, tôi nên sử dụng ví dụ: an AutoResetEvent
và kiểm tra xem sự kiện có được nâng lên trong một khoảng thời gian nhất định (có thể là +/- 3ms) hay không. Nhưng viết mã đó có phần vi phạm nguyên tắc DAMP (các cụm từ mô tả và có ý nghĩa), tôi nghĩ vậy. Có cách nào dễ hơn để thực hiện việc này không?
Tôi có nên phụ thuộc vào System.Threading.Timer
bên ngoài và sau đó có thể sử dụng shim cho mục đích thử nghiệm không? Thật không may, các bộ đếm thời gian .NET không có một giao diện chung (mà sẽ làm cho công việc của tôi quá cũ ...)
Suy nghĩ của bạn về chủ đề đó là gì? Có tài liệu nào mà tôi chưa tìm thấy và tôi nên đọc không?
Xin lỗi vì đã thực sự có nhiều câu hỏi trong bài đăng này, nhưng việc thử nghiệm các yêu cầu thời gian thực mềm này khá thú vị, tôi nghĩ vậy.
có thể sao chép http://stackoverflow.com/questions/9088313/unit-testing-system-timers-timer – Mzf
Tôi không nghĩ đó là một bản sao bởi vì tất cả các câu hỏi này đề cập đến các lớp học đóng gói một bộ đếm thời gian và làm thế nào để mô phỏng nó nhưng không ai thực hiện giao diện thực tế bằng cách sử dụng TDD. Các câu hỏi khác về vấn đề này là v.d. http: // stackoverflow.com/questions/879971/how-do-you-unit-test-classes-sử dụng-giờ-nội bộ hoặc http://stackoverflow.com/questions/12045/unit-testing-a-timer-based-application – feO2x
tạo ra một wrapper cảm thấy giống như một mùi. Tôi nghĩ rằng các lớp bộ đếm thời gian trong khuôn khổ được đảm bảo để làm việc. Tôi muốn phân lớp để kiểm tra chủ đề để gọi trình xử lý hẹn giờ của tôi hoặc tiêm khoảng thời gian riêng của tôi để viết một vài bài kiểm tra tích hợp. – bryanbcook