2010-08-10 6 views
2

J'ai une question à propos de Rhino Mock.Question à propos de Rhino Mock (RhinoAutoMocker)

J'essaie de mettre une restriction sur les méthodes qui pourraient être appelées à partir de la méthode testée.

Disons que j'ai une méthode que je suis en train d'écrire le test unitaire contre comme ceci:

public void MyMethod() 
{ 
    var test = _Repository.Get(2); 

    _Services.DoSomething(test); 
} 

ce que je fais est en ce moment quelque chose comme ceci:

[Test] 
public void TestMethod() 
{ 
    var mock1 = CreateMock<IRepository>(); 
    var mock2 = CreateMock<IServices)(); 

    mock1.Expect(x => x.Get(1).IgnoreArguments().Return(new Poo()).Repeat.Once(); 
    mock2.Expect(x => x.DoSomething(new Something()).IgnoreArguments().Repeat.Once(); 

    ClassUnderTest.MyMethod(); 

    mock1.VerifyAllExpectations(); 
    mock2.VerityAllExpectations(); 
} 

cela est bien beau, mais ce Je veux est d'empêcher quelqu'un de changer la méthode comme ceci:

public void MyMethod() 
{ 
    var test = _Repository.Get(2); 

    var test = _Repository.Save(test); 

    _Services.DoSomething(test); 
} 

Comme vous pouvez voir Enregistrer la méthode sur Repo sitory est appelé, donc c'est dangereux évidemment parce que si quelqu'un par erreur ajoute cette ligne là nous aurons des ennuis.

Comment puis-je empêcher cela? Merci.

Répondre

2

Il y a quelques options:

Mocks stricte

Les simulacres strictes lancera une exception si on les appelle d'une manière qui ne correspond pas à une attente. Vous pouvez créer des simulacres strictes comme ceci:

var mocks = new MockRepository(); 
var fooStrictMock = mocks.StrictMock<IFoo>(); 

.Repeat.Never()

Si vous ne souhaitez que prévenir les appels à une seule méthode particulière, vous pouvez utiliser le .Repeat.Never() quantificateurs sur une attente comme ceci:

mock1.Expect(x => x.Save(null)).IgnoreArguments().Repeat.Never(); 

AssertWasNotCalled

Vous pouvez appeler AssertWasNotCalled à la fin de votre test comme celui-ci:

var repositoryStub = MockRepository.GenerateStub<IRepository>(); 
repositoryStub.Stub(x => x.Get(2)).Return(...); 

var underTest = new UnderTest(repositoryStub); 
underTest.DoSomething(); 

repositoryStub.AssertWasNotCalled(x => x.Save(Arg<Thing>.Is.Anything)); 
+0

Merci pour votre réponse. Il y a un petit problème. en utilisant le Repeat.Never() et AssertWasNotCalled est un peu lent, parce que disons si j'ai 20 méthodes que je ne veux pas être alors je dois tous énumérer comme ci-dessus. la première option semble bien, mais je ne pouvais pas tout à fait le faire fonctionner avec AutoMock. Je vais essayer à nouveau plus tard. – Raha