Pergunta

Eu estou querendo teste que uma classe tem um EventHandler atribuído a um evento. Basicamente eu estou usando meu IoC Container para ligar EventHandlers para mim, e eu estou querendo checar se eles são atribuídos corretamente. Então, realmente, eu estou testando minha configuração IoC.

[Test]
public void create_person_event_handler_is_hooked_up_by_windsor()
{
    IChangePersonService changePersonService = IoC.Resolve<IChangePersonService>();

    // check that changePersonService.PersonCreated has a handler attached
}

Eu não tenho certeza de como teste que changePersonService.PersonCreated tem nada ligado a ele embora.

Todas as idéias?

Graças.

Foi útil?

Solução

Não questionando o que você finge com isso, a única maneira de testar e enumerar os eventos registrados é se o seu registo los em sua própria coleção.

Veja este exemplo:

public class MyChangePersonService : IChangePersonService
{
    private IList<EventHandler> handlers;

    private EventHandler _personEvent;

    public event EventHandler PersonCreated
    {
        add
        {
            _personEvent += value;
            handlers.Add(value);
        }

        remove
        {
            _personEvent -= value;
            handlers.Remove(value);
        }
    }

    public IList<EventHandler> PersonEventHandlers { get { return handlers; } }

    public MyChangePersonService()
    {
        handlers = new List<EventHandler>();
    }

    public void FirePersonEvent()
    {
        _personEvent(this, null);
    }
}

Em seguida, você pode acessar os manipuladores registrados com PersonEventHandlers prop.

Você pode implementar algo parecido com isto?

Outras dicas

Parece-me que você está tentando teste de unidade Castelo de Windsor. Desde que provavelmente já tem testes de unidade, eu acho que isso é um desperdício de esforço. Você seria melhor fora de testar se o objeto levanta os eventos apropriados nos momentos corretos (provavelmente por registrar um objeto fictício como o manipulador de eventos).

Não é realmente o teste de unidade, é um teste de integração. E eu não estou testando Castelo de Windsor, mas sim minha configuração do mesmo. Estou testando que todas as minhas aulas dissociados estão sendo ligado como eu pretendo.

Em última análise, eu quero testar que a minha configuração é ligar corretamente eventos como eu quero, mas eu não tenho certeza que o C # vai me deixar sem alterar minha API como diz Yuval.

Parece que você está tentando prod algumas informações fora de seu objeto, a fim de assert é uma coisa ou outra. Note que isso não é necessariamente o teste de unidade, porque você não está testando a funcionalidade.

Se você deve testar isso, parece que você vai precisar para abrir uma API pública em IChangePersonService a fim de obter os manipuladores de eventos registado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top