Teste de unidade para um evento usando Extensões Reativas
estou a usarExtensões reativas para .NET (Rx) expor eventos comoIObservable<T>
. Quero criar um teste de unidade em que afirmo que um determinado evento foi disparado. Aqui está uma versão simplificada da classe que eu quero testar:
public sealed class ClassUnderTest : IDisposable {
Subject<Unit> subject = new Subject<Unit>();
public IObservable<Unit> SomethingHappened {
get { return this.subject.AsObservable(); }
}
public void DoSomething() {
this.subject.OnNext(new Unit());
}
public void Dispose() {
this.subject.OnCompleted();
}
}
Obviamente minhas aulas reais são mais complexas. Meu objetivo é verificar se a execução de algumas ações com a classe em teste leva a uma sequência de eventos sinalizados noIObservable
. Felizmente, as classes que eu quero testar implementamIDisposable
e chamandoOnCompleted
o assunto quando o objeto é descartado facilita muito o teste.
Aqui está como eu testo:
// Arrange
var classUnderTest = new ClassUnderTest();
var eventFired = false;
classUnderTest.SomethingHappened.Subscribe(_ => eventFired = true);
// Act
classUnderTest.DoSomething();
// Assert
Assert.IsTrue(eventFired);
Usar uma variável para determinar se um evento é disparado não é muito ruim, mas em cenários mais complexos, talvez eu queira verificar se uma sequência específica de eventos é disparada. Isso é possível sem simplesmente registrar os eventos nas variáveis e depois fazer afirmações sobre as variáveis? Ser capaz de usar uma sintaxe fluente do tipo LINQ para fazer afirmações em umIObservable
espero tornar o teste mais legível.