2009-12-14 24 views
2

J'ai une question rapide que je n'ai pas pu trouver dans les documents sur NMock2.0.NMock - comment dire attendre n'importe quelle valeur sur ces paramètres? Ou devrais-je ne pas le faire?

J'ai une fonction appelée Save() que je veux simuler. Cela prend un ID de chaîne en tant que paramètre et une décimale comme valeur ..

Je sais que je peux écrire ce pour vous assurer que Save() est appelée avec 2 valeurs spécifiques:

Expect.Once.On(dao) _ 
    .Method("Save").With(New Object() {"foo", 1}) 

Mais ce ne laisse passer que si "foo" et 1 sont passés. J'ai le contrôle de la valeur "foo", mais pour la deuxième valeur, je ne sais pas ce que ce sera; ou je ne me soucie pas de tester ce que sa valeur sera au moins dans ce test spécifique.

Je sais que je peux écrire:

Expect.Once.On(dao) _ 
    .Method("Save").WithAnyArguments() 

Mais cela va me permettre de passer des arguements; donc si l'interface Save change et prend plus tard 5 paramètres, mon test passera quand même.

Comment puis-je m'assurer qu'il ne prend que les 2 paramètres, avec leurs types appropriés?

Peut-être plus important encore - est d'écrire un test unitaire comme celui-ci trop fragile? Peut-être devrais-je le coder pour m'attendre à des paramètres, de sorte que chaque fois que je refactorise, je n'ai pas besoin de revenir et de changer cette ligne? J'ai trouvé que mes cas de test qui utilisent beaucoup de mock sont très cassants et chaque fois que je refactor je dois les changer ... Peut-être que je mets-t-il des mocks ici? Encore assez nouveau pour ce genre de choses, donc tout conseil est grandement apprécié.

Répondre

5

Utilisez le comparateur Is.TypeOf() pour faire correspondre un type spécifique sans tenir compte de sa valeur. Vous voulez quelque chose comme:

Expect.Once.On(dao).Method("Save").With(Is.TypeOf(typeof(string))); 

Quant à savoir s'il est raisonnable ou non, je dirais que cela est bien dans le cas général si vous essayez de vérifier qu'une méthode peut traiter avec des paramètres de ses types d'entrée spécifiés . Par exemple, supposons que vous transmettez un Car à une méthode qui attend un Vehicle; il sera utile de s'assurer que la méthode peut gérer correctement les types dérivés.

+0

Merci pour la réponse. Est-ce que cela signifie que mon objet 'dao' est maintenant considéré comme un faux, parce que je suis contre? Dans ce cas, comment faire un 'stub' avec NMock pour qu'il ne fasse que compiler le code sans affirmer? Est-ce que je fais juste .WithAnyParameters()? Ou ce serait encore considéré comme un faux à cause de VerifyExpectationsHasBeenMet() échouera si la fonction n'est pas appelée? Si oui, comment faire un «bouchon» tel que défini par Fowler? – dferraro

+0

@dferraro aux stubs remplacez simplement 'Expect.Once' par' Stub' afin que votre appel stubbed ne compte pas dans VerifyExpectationsHasBeenMet. – nolith

2

Vous pouvez créer une classe simple:

class DontCare 
{ 
    public override bool Equals(object obj) 
    { 
     return true; 
    } 
} 

Expect.Once.On(dao).Method("Save").With(new DontCare());