2010-12-14 33 views
1

Quelle est la meilleure façon pour Rhino Mocks de tester qu'un paramètre particulier est passé sur l'appel FINAL à une méthode? Par exemple mockview.SetSomething (myObj) peut être appelé un nombre de fois par mockview.Init, mais je veux tester que la dernière fois il est appelé mockview.SetSomething (inParticular). Maintenant je sais que je peux utiliser GetArgumentsForCallsMadeOn avec ceci, mais mon problème est que cela ne fonctionne pas si j'ai par la suite changé la variable de maintien de paramètre. par exemple Comment est-ce que je teste les "paramètres passés dans l'appel final" en utilisant RhinoMocks?

public interface IView 
{ 
    void SetSomething(ViewData data); 
} 

public class ViewData 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 

    public ViewData Person(int age, string name) 
    { 
     Age = age; 
     Name = name; 
     return (this); 
    } 
} 

public class WorkingPresenter 
{ 
    public void Init(IView view) 
    { 
     var data = new ViewData {Age = 1, Name = "One"}; 
     view.SetSomething(data); 
     data = new ViewData {Age = 2, Name = "Two"}; 
     view.SetSomething(data); 
     data = new ViewData {Age = 3, Name = "Three"}; 
    } 
} 

public class NotWorkingPresenter 
{ 
    private ViewData _data; 

    public void Init(IView view) 
    { 
     _data = new ViewData(); 
     view.SetSomething(_data.Person(1, "One")); 
     view.SetSomething(_data.Person(2, "Two")); 
     _data.Person(3, "Three"); 

    } 
} 

alors mes tests sont ...

[Test] 
    public void GetDataOfLastCall() 
    { 
     ViewData dummydata=null; 
     var view = MockRepository.GenerateStub<IView>(); 

     //Approach 1 : This works 
     var workingPresenter = new WorkingPresenter(); 
     workingPresenter.Init(view); 
     var lastCall = view.GetArgumentsForCallsMadeOn(v => v.SetSomething(dummydata)).Count - 1; 
     var lastParams = view.GetArgumentsForCallsMadeOn(v => v.SetSomething(dummydata))[lastCall]; 
     var lastData = (ViewData)lastParams[0]; 

     //Approach 2: This doesn't 
     var notWorkingPresenter = new NotWorkingPresenter(); 
     notWorkingPresenter.Init(view); 
     lastCall = view.GetArgumentsForCallsMadeOn(v => v.SetSomething(dummydata)).Count - 1; 
     lastParams = view.GetArgumentsForCallsMadeOn(v => v.SetSomething(dummydata))[lastCall]; 
     lastData = (ViewData)lastParams[0]; 

Ce que je veux est de vérifier que le dernier appel à SetSomething était avec {name = "Deux", age = 2}. WorkingPresenter le fait maintenant mais ne pensez-vous pas que notWorkingPresenter le fera aussi?

Répondre

1

Il doit y avoir quelque chose d'autre qui se passe dans votre code (en dehors du moqueur). Je viens de jeter ensemble quelques éléments:

public interface IView 
{ 
    void SetSomething(ViewData data); 
} 

public class ViewData 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
} 

Et je l'ai testé avec:

[TestMethod] 
public void GetDataOfLastCall() 
{ 
    var view = MockRepository.GenerateStub<IView>(); 

    var data = new ViewData {Age = 1, Name = "One"}; 
    view.SetSomething(data); 
    data = new ViewData { Age = 2, Name = "Two" }; 
    view.SetSomething(data); 
    data = new ViewData { Age = 3, Name = "Three" }; 

    var lastCall = view.GetArgumentsForCallsMadeOn(v => v.SetSomething(data)).Count - 1; 
    var lastParams = view.GetArgumentsForCallsMadeOn(v => v.SetSomething(data))[lastCall]; 
    var lastData = (ViewData) lastParams[0]; 
} 

Et je suis les valeurs de 2 et « deux » à l'intérieur du ViewData. Il semble que Rhino.Mocks supporte ce que vous voulez faire. Pourriez-vous créer un scénario de test qui affiche le problème identifié dans votre question initiale (où vous avez obtenu une référence aux informations les plus récentes)?

+0

Salut Patrick.Oui désolé: en essayant de simplifier le code, j'ai simplifié le problème! Ce qui suit démontre ce que je pense que le problème est. Pour être honnête, je peux voir de meilleures façons d'écrire le code maintenant, mais je m'attendais intuitivement à ce que NotWorkingPresenter fonctionne. –