Pergunta

Estou tentando escrever um teste de unidade para a função 'IsUnique' na classe abaixo que se parece com isto:

class Foo
{
    public bool IsUnique(params...)
    {
       ValidateStuffExists(params);
       return CheckUniqueness(params);
    }

    private void ValidateStuffExists(params)
    {
      //does some validation
    }

    private bool CheckUniqueness(params)
    {
       //does logic to determine if its unique per params
       return result;
    }

}

A única coisa que quero testar aqui é que ValidateStuffExists e CheckUniqueness são chamados e passam os argumentos.Isso é tudo que esta função faz, então é tudo que vou testar (vou dobrar a psuedo-regra 'testar apenas comportamento público' e testar os métodos privados aqui, porque ou tem um grande método/testes complicados ou testa 2 privados métodos).

Estou aberto a qualquer biblioteca de zombaria.Eu uso o NMock e não achei que fosse adequado para a tarefa - então baixei o TypeMock enquanto lia e ouvi que este era o melhor e que poderia zombar até mesmo de classes concretas/chamadas de métodos sem interface ...

Estou fazendo algo assim no meu teste e lança uma exceção na linha 'Isolate.WhenCalled':

        CrmEntityUniqueValidator_Accessor target = new CrmEntityUniqueValidator_Accessor(); // TODO: Initialize to an appropriate value
        DynamicEntity entity = null; // TODO: Initialize to an appropriate value
        string[] propertyNames = null; // TODO: Initialize to an appropriate value

        bool tru = true;
        Isolate.WhenCalled(() => target.CheckUniqueness(entity, propertyNames, null, null)).WillReturn(tru);

        target.ValidatePropertiesExist(entity, propertyNames);

        Isolate.Verify.WasCalledWithArguments(() => target.ValidatePropertiesExist(entity, propertyNames));
        Isolate.Verify.WasCalledWithArguments(() => target.CheckUniqueness(entity, propertyNames, null, null));

Isso lança uma exceção como "*** WhenCalled não suporta o uso de uma chamada de método como argumento."

Mesmo que eu seja capaz de fazer a mesma coisa com uma classe CLR - posso zombar de DateTime.Now fazendo isso (o código funciona):

        DateTime endOfWorld = new DateTime(2012, 12, 23);
        Isolate.WhenCalled(() => DateTime.Now).WillReturn(endOfWorld);
        DateTime dt = DateTime.Now;

        Assert.AreEqual(dt, endOfWorld);

Alguém tem algum conselho aqui?Preciso dividir esses 2 métodos em uma classe separada e fazer com que uma interface seja a única maneira?ou complicar meu método/testes???Deve haver algo que estou faltando aqui...Muito obrigado por qualquer ajuda antecipadamente.

EDITAR:Acho que estou tentando zombar dos dois métodos privados da classe para um teste de unidade.Como eu poderia fazer isso sem ter que dividir esses dois métodos em uma classe/interface separada?

Foi útil?

Solução

tente isolar.nonpublic.whencalled (objeto, "método não público"). IGNORECALL

ou Isolate.Verify.NonPublic.WasCalled(objeto,"método"..

Outras dicas

RhinoMocks tem o AssertWasCalled método que pode servir ao propósito de garantir que um método chame outro método...mas não tenho certeza se você pode fazer isso em uma função privada da mesma classe em que está testando a unidade.Acho que você só poderia fazer isso se os dois métodos que você deseja fazer o stub estivessem em outra classe de dependência que foi injetada.

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