Pergunta

Eu tenho uma propriedade em uma interface que eu zombava usando Rhino Mocks. Eu quero saber se ele foi acessado no meu teste de unidade.

Existe uma maneira para ver se a propriedade foi acessada via Rhino Mocks?

Eu encontrei este código aqui , mas ele não parece trabalho:

string name = customerMock.Name;
customerMock.AssertWasCalled(x => {var ignored = x.Name;});

Eu reproduzida este código e eu recebo o seguinte:

Rhino.Mocks.Exceptions.ExpectationViolationException: IAddAddressForm.get_FirstName(); Expected #1, Actual #0..

Eu gostaria de usar essa sintaxe, mas devo estar faltando alguma coisa. Eu estou chamando-lo com um topo (não um mock) isso faz alguma diferença?

Foi útil?

Solução 2

Acontece que a sintaxe eu estava usando não funciona. Mas só funciona se a propriedade não está no modo PropertyBehavior. (Que é o padrão para canhotos e pode ser ligado por simulações).

Uma vez que o modo PropertyBehavior está ligado, em seguida, que a sintaxe não funciona. De acordo com a Ayende você tem que verificar o valor naquele ponto.

Outras dicas

Existe uma maneira para ver se a propriedade foi acessada via Rhino Mocks?

Sim. Você pode configurar uma expectativa para a propriedade. Se a verificação não joga, então você sabe que a propriedade foi acessada:

var mocks = new MockRepository();
IFoo foo = mocks.DynamicMock<IFoo>;
// this sets up an expectation that Name is accessed, and what it should return
Expect.Call(foo.Name).Return("John Doe"); 
mocks.ReplayAll()

// test something that uses IFoo here ...

mocks.VerifyAll();  // Throws if foo.Name was not accessed after ReplayAll()

Isso tudo é assumindo que você quer foo.Name a ser acessado. Se o seu objetivo é verificar se é não acessado, então você deve apenas usar StrictMock vez de DynamicMock. A simulação rigorosa vai jogar para todas as chamadas inesperadas.

Se você quiser afirmar que um método foi chamado ou uma propriedade acessada em um objeto falsificado, você deve sempre usar um mock. Stubs são para as situações em que você não quer para testar a interação, mas só quero ter certeza de que uma chamada para algum objeto retorna um determinado valor para tornar o fluxo lógico.

Eu acredito StrictMock é o que você está procurando. Há algumas informações sobre ele aqui . A sua utilização é dito ser desencorajado porque ele pode fazer testes muito frágil, no entanto, ele deve ajudá-lo a conseguir o que você está tentando fazer.

Você pode verificar a pilha de chamadas usando a classe StackFrame. Não muito limpo, mas deve dar o resultado desejado ...

Eu costumo usar Moq que usa Castelo de modo que você pode considerá-lo em vez / em conjunto com de Rhino Mocks. Isto é como você pode fazê-lo lá:

// expects an invocation to set the value to "foo"
mock.SetupSet(foo => foo.Name = "foo");

// or verify the setter directly
mock.VerifySet(foo => foo.Name = "foo");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top