2009-08-18 16 views
2

J'ai une propriété dans une interface que j'ai tournée en utilisant Rhino Mocks. Je veux savoir s'il a été accédé à mon test unitaire.Puis-je savoir si une propriété a été accédée via Rhino Mocks

Existe-t-il un moyen de voir si la propriété a été accédée via Rhino Mocks?

Je trouve ce code here mais il ne semble pas fonctionner:

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

Je reproduis ce code et je reçois le texte suivant:

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

Je voudrais utiliser cette syntaxe, mais J'ai dû louper quelque chose. Je l'appelle avec un talon (pas un faux) est-ce que cela fait une différence?

Répondre

1

Il s'avère que la syntaxe que j'utilisais fonctionne. Mais cela ne fonctionne que si la propriété n'est pas en mode PropertyBehavior. (Qui est la valeur par défaut pour les stubs et peut être activé pour les faux). Une fois le mode PropertyBehavior activé, cette syntaxe ne fonctionne pas.

Selon Ayende vous devez vérifier la valeur à ce moment-là.

0

Je crois que StrictMock est ce que vous cherchez. Il y a quelques informations à ce sujet here. Son utilisation est déconseillée car elle peut rendre les tests trop fragiles, mais cela devrait vous aider à réaliser ce que vous essayez de faire.

0

Vous pouvez vérifier la pile d'appels à l'aide de la classe StackFrame. Pas très propre, mais il devrait donner le résultat désiré ...

0

J'utilise habituellement Moq qui utilise Castle donc vous pouvez le considérer à la place/avec Rhino Mocks. Voici comment vous pouvez le faire là-bas:

// 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"); 
3

est-il un moyen de voir si la propriété a été accessible via Rhino Mocks?

Oui. Vous pouvez définir une attente pour la propriété. Si la vérification ne sait pas jeter, vous la propriété a été consultée:

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() 

C'est tout en supposant que vous voulez foo.Name à accéder. Si votre objectif est de vérifier qu'il est pas accédé, alors vous devriez simplement utiliser StrictMock au lieu de DynamicMock. Un simulacre rigoureux jettera pour tous les appels inattendus.

1

Si vous souhaitez affirmer qu'une méthode a été appelée ou qu'une propriété a été accédée sur un objet falsifié, vous devez toujours utiliser un modèle fictif. Les stubs sont pour les situations dans lesquelles vous ne voulez pas tester l'interaction, mais vous voulez simplement vous assurer qu'un appel à un objet renvoie une certaine valeur pour que le flux logique se déroule.