Eu tenho algum código que gera PropertyChanged
eventos e gostaria de poder testar a unidade de que os eventos estão sendo gerados corretamente.
O código que está gerando os eventos é como
public class MyClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public string MyProperty
{
set
{
if (_myProperty != value)
{
_myProperty = value;
NotifyPropertyChanged("MyProperty");
}
}
}
}
Eu recebo um bom teste verde do código a seguir em meus testes de unidade, que usa delegados:
[TestMethod]
public void Test_ThatMyEventIsRaised()
{
string actual = null;
MyClass myClass = new MyClass();
myClass.PropertyChanged += delegate(object sender, PropertyChangedEventArgs e)
{
actual = e.PropertyName;
};
myClass.MyProperty = "testing";
Assert.IsNotNull(actual);
Assert.AreEqual("MyProperty", actual);
}
No entanto, se eu tentar encadear a configuração de propriedades da seguinte maneira:
public string MyProperty
{
set
{
if (_myProperty != value)
{
_myProperty = value;
NotifyPropertyChanged("MyProperty");
MyOtherProperty = "SomeValue";
}
}
}
public string MyOtherProperty
{
set
{
if (_myOtherProperty != value)
{
_myOtherProperty = value;
NotifyPropertyChanged("MyOtherProperty");
}
}
}
Meu teste para o evento falha - o evento que ele captura é o evento para MyOtherProperty.
Tenho certeza de que o evento é acionado, minha interface do usuário reage da mesma forma, mas meu delegado captura apenas o último evento.
Então, eu estou pensando:
1. Meu método de testar eventos está correto?
2. Meu método de gerar eventos encadeados está correto?
fonte
Se você estiver fazendo TDD, o teste de eventos poderá começar a gerar muitos códigos repetitivos. Eu escrevi um monitor de eventos que permite uma abordagem muito mais limpa da gravação de testes de unidade para essas situações.
Por favor, veja minha resposta ao seguinte para mais detalhes.
Teste de unidade de que um evento é gerado em C #, usando reflexão
fonte
Isso é muito antigo e provavelmente nem será lido, mas com alguns novos recursos .net, criei uma classe INPC Tracer que permite:
Veja o gist: https://gist.github.com/Seikilos/6224204
fonte
Abaixo está um código de Andrew ligeiramente alterado que, em vez de apenas registrar a sequência de eventos gerados, conta quantas vezes um evento específico foi chamado. Embora seja baseado no código dele, acho mais útil nos meus testes.
fonte
Com base neste artigo, eu criei este auxiliar de asserção simples:
Com esse auxiliar de método, o teste se torna realmente simples.
fonte
Não escreva um teste para cada membro - isso é muito trabalho
(talvez essa solução não seja perfeita para todas as situações - mas mostra uma maneira possível. Talvez seja necessário adaptá-la ao seu caso de uso)
É possível usar o reflexo em uma biblioteca para testar se todos os membros estão respondendo corretamente ao evento alterado de sua propriedade:
O código a seguir pode ser usado como uma biblioteca e mostra como testar a seguinte classe genérica
Os testes de sua classe agora podem ser escritos como. (talvez você queira dividir o teste em "evento está aí" e "evento gerado com o nome correto" - você pode fazer isso sozinho)
Classe
fonte
Eu fiz uma extensão aqui:
Existe o uso:
fonte