Şu anda zamanlayıcılar kavramını soyutlamaktayım ki, ihtiyaç duyan sınıflarım, test modunda ya da farklı modda operasyon modlarında (örneğin, threadpool zamanlayıcıları, thread-affine zamanlayıcıları, vb.) Sahte zamanlayıcılar kullanabilirler.Bir birim sınıfı nasıl test edilir (adaptör modeli)?
public interface ITimer : IDisposable
{
bool IsEnabled { get; }
bool IsAutoResetting { get; set; }
TimeSpan Interval { get; set; }
void Start();
void Stop();
event EventHandler IntervalElapsed;
}
Şimdi System.Threading.Timer
sınıf uyum sağlar ve bu arabirimi uygulayan bir sarmalayıcı oluşturmak istiyorum: Bu nedenle, bu arayüzü yarattı. Test odaklı geliştirmeyi kullanarak yapmak istiyorum. Benim sınıf anda biraz şuna benzer:
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);
}
}
Benim asıl soru şudur: nasıl Start
, Stop
ve IntervalElapsed
davranışlarından (yumuşak gerçek zamanlı) gereksinimlerini tanımlayan birim testleri yazardınız?
Kanaatimce, örn. Bir AutoResetEvent
ve olay belirli bir zaman dilimi içinde yükseltilmiş olup olmadığını kontrol edin (belki +/- 3ms). Ancak bu kodu yazmak DAMP (betimsel ve anlamlı ifadeler) ilkesini biraz ihlal ediyor, bence. Bunu yapmanın daha kolay bir yolu var mı?
Bağımlılığı System.Threading.Timer
harici yapmalıyım ve daha sonra test amacıyla bir shim kullanabilir miyim? Ne yazık ki, .NET zamanlayıcıları ortak bir arabirime sahip değil (ki bu benim işimi eskimiş olur) ...
Bu konuyla ilgili düşünceleriniz nelerdir? Henüz bulamadığım ve okumam gereken belgeler var mı?
Aslında bu gönderide birden fazla soruya sahip olduğum için üzgünüm, ancak bu gerçek zamanlı gereksinimlerin test edilmesi oldukça ilginç, bence.
olası kopyalama http://stackoverflow.com/questions/9088313/unit-testing-system-timers-timer – Mzf
bir yineleme çünkü tüm bu sorular bir zamanlayıcıyı kapsülleyen sınıflara ve bununla nasıl başa çıkılacağına, ancak TDD'yi kullanarak gerçek arabirimi uygulayan hiçbir şeye başvurmaz. Bununla ilgili diğer sorular örn. http: // stackoverflow.com/questions/879971/how-do-you-unit-test-classes-bu-kullanım-zamanlayıcılar-dahili veya http://stackoverflow.com/questions/12045/unit-testing-a-timer-based-application – feO2x
bir sarıcı oluşturmak bir koku gibi hissediyor. Çerçevedeki zamanlayıcı sınıfının çalışmasının garanti edildiğini düşünüyorum. Zamanlayıcılarımı çağırmak için konuyu test etmeyi veya birkaç entegrasyon testi yazmak için kendi aralıklarımı enjekte etmeyi seçerdim. – bryanbcook