Jak testować stoper oparciu o System.Threading.Timer w .NET System.Threading.Timer jednostka ma metodę zwrotnąjednostka testowa System.Threading.Timer w .NET
Odpowiedz
Możesz go przetestować, nie tworząc bezpośredniej zależności od System.Threading.Timer
. Zamiast tego utwórz interfejs ITimer
i otoki o wartości System.Threading.Timer
, który go implementuje.
Najpierw trzeba przekształcić zwrotnego do wydarzenia, tak aby mógł on być częścią interfejsu:
public delegate void TimerEventHandler(object sender, TimerEventArgs e);
public class TimerEventArgs : EventArgs
{
public TimerEventArgs(object state)
{
this.State = state;
}
public object State { get; private set; }
}
następnie utworzyć interfejs:
public interface ITimer
{
void Change(TimeSpan dueTime, TimeSpan period);
event TimerEventHandler Tick;
}
oraz owijkę:
public class ThreadingTimer : ITimer, IDisposable
{
private Timer timer;
public ThreadingTimer(object state, TimeSpan dueTime, TimeSpan period)
{
timer = new Timer(TimerCallback, state, dueTime, period);
}
public void Change(TimeSpan dueTime, TimeSpan period)
{
timer.Change(dueTime, period);
}
public void Dispose()
{
timer.Dispose();
}
private void TimerCallback(object state)
{
EventHandler tick = Tick;
if (tick != null)
tick(this, new TimerEventArgs(state));
}
public event TimerEventHandler Tick;
}
Oczywiście należy dodać wszelkie przeciążenia konstruktora i/lubMetoda 0, której należy użyć od Threading.Timer
. Teraz można przetestować urządzenie wszystko w zależności od ITimer
z fałszywą czasowy:
public class FakeTimer : ITimer
{
private object state;
public FakeTimer(object state)
{
this.state = state;
}
public void Change(TimeSpan dueTime, TimeSpan period)
{
// Do nothing
}
public void RaiseTickEvent()
{
EventHandler tick = Tick;
if (tick != null)
tick(this, new TimerEventArgs(state));
}
public event TimerEventHandler Tick;
}
Ilekroć chcesz symulować kleszcza, zadzwoń RaiseTickEvent
na fałszywe.
będę testować go w w taki sam sposób jak w każdej innej klasie, ale z krótkimi przerwami, aby uniknąć długiego testu urządzenia. Innym podejściem jest testowanie własnego kodu i używanie próbnego licznika czasu (np. NMock), ale to zależy od tego, jak wygląda twój kod. Czy możesz opublikować niektóre fragmenty kodu?
Jeśli czas po prostu zmienia metodę wywołania zwrotnego, wystarczy sprawdzić poprawność tej metody, a nie czas działania systemu.
Poza tym zalecam używanie MultimediaTimer zamiast - jest o wiele bardziej dokładny.
Powiedz, że chcę zegar, który odpala raz na godzinę. Czy polecasz 'MultimediaTimer' dla każdego? :) –
Tak, i połącz go z Dispatcherem .NET, jeśli chcesz zwrócić wątek interfejsu użytkownika. –
Mam nadzieję, że cokolwiek ta funkcja stanowi większą część, pozwala skonfigurować interwał czasomierza. Powinieneś być w stanie użyć tego interfejsu, aby wstrzyknąć krótki odstęp odpowiedni do testowania jednostkowego. Mam pytanie o wartość tego testu: Czy testujesz interwał (bezcelowy) lub czy rutyna jest tak często wywoływana co jakiś czas?
- 1. Jednostka testowa profili Automappera
- 2. Inject Usługi w Grails jednostka testowa
- 3. Jednostka testowa Kod AS3 dla Flasha
- 4. Jednostka testowa Entity Framework za pomocą moq
- 5. Jednostka testowa kątowa dyrektywa, która używa ngModel
- 6. Jednostka Funkcja testowa, która zwraca Mongoose obiecują
- 7. Pomoc w projektowaniu małą jednostka testowa Makro w Clojure
- 8. Jednostka testowa Sterowanie rzutem swift-rzutnik z storyboardu nie działa
- 9. System.Threading.Timer nie odpala po pewnym czasie
- 10. Jednostka testująca kontroler poczty .NET Web Api
- 11. Jednostka testowa metoda prywatna, która używa żądania, potoku i strumienia przy użyciu próbek
- 12. Dlaczego System.Timers.Timer przetrwał GC, ale nie System.Threading.Timer?
- 13. @ Testowa klasa testowa wpływa na sposób funkcjonowania warstwy usług transakcyjnych
- 14. ChefSpec i kuchnia testowa
- 15. Testowa instalacja kończy się niepowodzeniem, nie vcbuild.exe
- 16. jednostka jednostka ramy + + lub repozytorium pytanie
- 17. Dodawanie System.Threading.Timer do usługi Windows w VS 2010
- 18. Jednostka iTextSharp
- 19. Klasa testowa Junit zakres testowy
- 20. Dokonywanie Karma a.k.a Testowa praca
- 21. Funkcja testowa mt_rand z PHPUnit
- 22. Jednostka podmiotu Symfony2 w modelu
- 23. Jednostka zatrzymanych sterty w zaćmieniu?
- 24. Brakujące kropki postępu i 0% przekazany na wyjściu testowym szyny (jednostka testowa, szyny 3.1 RC6, Ruby 1.9.2)
- 25. Jednostka testująca klasę, która używa licznika czasu
- 26. Struktura testowa, która zastąpi Watin, jeśli przestanie być utrzymywana?
- 27. Błąd czasowego, to niejednoznaczny odniesienia między System.Windows.Forms.Timer „” i „” System.Threading.Timer
- 28. Jednostka testująca kompilator
- 29. Jednostka wtrysku testowanie konstruktor
- 30. Jednostka testująca HttpApplication
To wygląda dobrze, ale dlaczego tworzysz własnego delegata, a nie tylko używasz delegata TimerCallback z BCL? – Shaun
@Shaun: Ponieważ ten delegat nie jest prawidłową obsługą zdarzeń. Program obsługi zdarzeń ma określony podpis: 'obiekt nadawca, TEventArgs e', gdzie' TEventArgs: EventArgs'. – Aaronaught
Uważam, że w dzisiejszych czasach, gdy zamknięcia są tak chętnie wspierane, jeśli chciałem czegoś szybkiego i brudnego, nie wiem, czy zawracałbym sobie głowę całą deklaracją zdarzenia i okablowaniem, mógłbym po prostu przekazać akcję zamiast tego. – Aaronaught