2010-09-07 3 views
1

Comment vérifier si Create n'a pas été appelé sans utiliser la méthode Rhino Mocks AssertWasNotCalled.Comment vérifier si la méthode Create a été appelée en utilisant Expect au lieu de AssertWasNotCalled dans Rhino Mocks?

Voici le test:

[Test] 
    public void When_try_to_create_directory_that_already_exits_return_false() 
    { 
     var directoryInfoMock = MockRepository.GenerateMock<IDirectoryInfoWrap>(); 
     directoryInfoMock.Stub(x => x.Exists).Return(true); 
     directoryInfoMock.Expect(x => x.Create()); 
     Assert.AreEqual(false, new DirectoryInfoSample().TryToCreateDirectory(directoryInfoMock)); 

     directoryInfoMock.VerifyAllExpectations(); 
    } 

De plus, quelqu'un peut-il clarifier ce que fait Stub.

+0

Ce n'est pas lié à votre question mais vous pourriez améliorer légèrement la lisibilité et la concision de vos tests en utilisant 'Assert.IsFalse (x)' au lieu de 'Assert.AreEqual (false, x)'. –

+0

Oui, je sais. Je faisais juste un tutoriel en ligne. J'ai juste commencé à utiliser MbUnit et j'ai remarqué que vous faisiez partie du projet Gallio. Très bon travail. – Xaisoft

Répondre

2
directoryInfoMock.Stub(x => x.Exists).Return(true); 

assure que tout appel à la propriété directoryInfoMock.Exists retournera true. Mais si la propriété n'est jamais appelée ou appelée plusieurs fois, et non provoquera l'échec du test. Le but du talon est de fournir un peu de repas à votre code sous test afin qu'il puisse fonctionner normalement.

directoryInfoMock.Expect(x => x.Create()); 

que la attend méthode directoryInfoMock.Create être appelé au moins une fois. Sinon, une exception sera lancée par Rhino.Mocks lors de l'exécution de directoryInfoMock.VerifyAllExpectations(). Donc, en gros, votre test unitaire devrait fonctionner comme prévu. Quelle est la sortie du test?


MISE À JOUR:
Vous pouvez spécifier un nombre explicite de fois que la méthode doit être appelée ainsi. Cela peut être fait en utilisant Repeat.x avec x est Once(), Twice(), Never(), ou Times(N).

directoryInfoMock.Expect(x => x.Create()).Repeat.Never(); 

Ce attend à ce que Create est jamais appelé. Et bien sûr, votre test échouera s'il est effectivement appelé.

+0

Eh bien, j'ai un test où je veux que Create soit appelé et cela fonctionne, mais j'ai un autre test où je ne veux pas que Create soit appelé et j'étais curieux de savoir s'il y avait quelque chose comme DoNotExpect. En ce qui concerne votre réponse sur les stubs, si je vous ai bien compris, je place la propriété Exists à true sur l'objet Directory au lieu de devoir la définir explicitement ailleurs. S'il y avait d'autres propriétés que je devais définir, je pourrais les tailler aussi, n'est-ce pas? – Xaisoft

+0

Pour le modèle "DoNotExpect", vous pouvez utiliser la propriété "Repeat" de Rhino.Mocks. Voir ma réponse mise à jour. –

1

Si vous devez vous assurer que seules les méthodes que vous attendez sont appelées, vous pouvez envisager d'utiliser des simulacres stricts. Ensuite, vous obtiendrez une exception lorsqu'une méthode a été appelée qui n'a pas été prévu sur votre maquette, le seul changement à votre code est lorsque vous créez votre maquette:

var directoryInfoMock = MockRepository.GenerateStrictMock<IDirectoryInfoWrap>(); 

si vous savez exactement quelle méthode ne devrait pas être appelé il vaut mieux utiliser AssertWasNotCalled (vous l'utilisez après l'exécution de votre test). De cette façon, vous ne liez pas votre test avec votre code si étroitement.

Questions connexes