2010-12-09 28 views
0

j'ai une classe que je teste, disons:Rhino Mocks, essai que la méthode testée ne remet pas une méthode donnée

class Service{ 
public virtual DALClass DALAccess{get;set;} 
public virtual void Save(TEntity t){} 
public virtual bool Validate(TEntity t) 
} 

Je veux tester la méthode Enregistrer et dans le cadre de mon test Je veux que basé sur une propriété dans TEntity affirmer que la méthode Validate n'est pas appelée et qu'une méthode dans la DALClass le fait.

C'est ce que j'ai:

[TestMethod] 
void TestSave(){ 
//arrange 
TEntity entity = new TEntity(); 
Service service = new Service(); 
DALClass dal = MockRepository.GenerateMock<DALClass >(); 
dal.Expect(t => t.MustSaveInstance(Arg.Is(entity))).Return(false); 
service.DALAccess = dal; 
//act 
service.Save(entity); 
dal.VerifyAllExpectations(); 

//Question, how can I verify that service.Validate is not called 

Merci, Ignacio

Répondre

0

Créer une nouvelle classe TEST_Service qui dérive de service, remplace .Validate et les journaux que ce soit appelé ou non:

class TEST_Service : Service 
{ 
    public override bool Validate(...) 
    { 
     // Remember that I was called 
     ValidateCalled = true; 
     base.Validate(...); 
    } 
    public bool ValidateCalled { get; set; } 
} 

Ensuite, vérifiez service.ValideAppel

+0

Que faire si Valider n'est pas virtuel? – ignacio

+0

Alors vous êtes SOL. Cela fait partie de la compilation que j'ai dû faire à certains moments - faites des méthodes virtuelles juste pour TDD. Pas ravi à ce sujet, mais si je ne peux pas refactoriser logiquement c'est un compromis raisonnable à mon humble avis. – n8wrl

1

Créez un PartialMock de service. Puis remplacez l'appel à Valider et faites-lui faire un Assert.Fail lorsqu'il est appelé. Quelque chose comme ceci:

service.Stub(s => s.Validate(entity)).WhenCalled(i => Assert.Fail("Validate called"));