2010-07-29 4 views
30

Essayer de se moquer de la méthode suivante:Utiliser Rhino Mocks pour se moquer un paramètre out, qui est créé dans la méthode que je teste

bool IsLoginValid(LoginViewModel viewModel, out User user); 

Essayé ce départ:

dependency<ILoginService>() 
.Stub(serv => 
     serv.IsLoginValid(
      Arg<LoginViewModel>.Is.Equal(a_login_viewmodel), 
      out Arg<User>.Is.Anything) 
.Return(false); 

Mais, qui ne , comme c'est un paramètre out. A fait un peu de recherche autour de et modifié mon code comme tel:

dependency<ILoginService>() 
.Stub(serv => 
     serv.IsLoginValid(
      Arg<LoginViewModel>.Is.Equal(a_login_viewmodel), 
      out Arg<User>.Out(new User()).Dummy)) 
.Return(false); 

Qui échoue également. J'ai besoin de 'new User()' pour être en quelque sorte un argument 'Anything'. Comme je pense que cela attend une instance spécifique.

Une idée pour contourner ce problème? Merci les gars.

+1

Quelle erreur obtenez-vous dans le dernier cas? Ça a l'air correct ... – Grzenio

Répondre

39

Essayez l'option "OutRef". Il accepte un objet params [] qui définit le résultat pour chaque paramètre out. Puisque vous n'en avez qu'un, vous n'avez besoin que d'un résultat. Voici une maquette rapide de ce que j'ai essayé qui devrait fonctionner dans votre situation:

var foo = MockRepository.GenerateStub<IFoo>(); 
var viewModel = new LoginViewModel(); 
User temp; 
foo.Stub(f => f.IsLoginValid(viewModel, out temp)).OutRef(new User()).Return(false); 

User outparam; 
Assert.IsFalse(foo.IsLoginValid(viewModel, out outparam)); 
+1

Aaah, oui, ta légende absolue. Cela a fonctionné parfaitement. Merci mec! – ctrlplusb

12

Changer la réponse acceptée (par @Patrick Steele) pour faire correspondre les noms de variables et les espaces dans la question:

.Stub(serv => serv.IsLoginValid(
      a_login_viewmodel, 
      out temp)).OutRef(new User()) 
.Return(false); 

... alors changer la syntaxe (mais pas la sémantique) à la syntaxe Args couramment:

.Stub(serv => serv.IsLoginValid(
      Arg<LoginViewModel>.Is.Equal(a_login_viewmodel), 
      out Arg<User>.Out(new User()).Dummy)) 
.Return(false); 

... puis nous nous retrouvons avec la même syntaxe exacte que la deuxième tentative de l'OP, WHIC h apparemment "échoue". Personnellement, je préfère le style «Args» courant, même s'il est un peu plus verbeux.

TL; DR la deuxième tentative de l'OP est sémantiquement équivalente à la réponse acceptée, utilise simplement une syntaxe différente.

+0

Je ne comprends pas, l'exemple de syntaxe Args fluide dans votre réponse est la même que la deuxième approche @ctrlplusb. Il se plaint que cela ne fonctionne pas non plus. Est-ce que je manque quelque chose? –

+0

@AntonKalcik: ce que * _I_ * n'obtient pas, c'est pourquoi l'OP dit "Cela a fonctionné parfaitement" et l'accepte comme La Vraie Réponse quand elle est sémantiquement équivalente à quelque chose qu'il a dit "échouer". Ma réponse dit essentiellement, n'abandonnez pas une syntaxe supérieure juste parce que vous avez corrigé un bug involontairement quand vous avez réécrit la chose. " – onedaywhen

+0

Vous avez raison, vous voulez juste demander, parce que j'étais confus, je l'ai essayé et votre syntaxe imite exactement celle de Patrick Steel. code. –

Questions connexes