2014-09-07 3 views
0

Je veux tester des méthodes dans mon contrôleur, je sais à ce sujet ...fakeiteasy initialisation dans le constructeur privé membres

myController = new MyController(); 

A.CallTo(()=>myController.SomeMethodIWantToTest().Returns(someValueIAmTesting); 

Le problème est que dans ce constructeur parameterless, j'appelle de nombreuses méthodes dans d'autres ensembles qui définissent valeurs pour les membres privés,

public class MyController : Controller { 

    private ILoginBusiness loginBusiness; 
    private ISomethingElse somethingElse; 
    //... and so on... 

    public MyController(){ 

     loginbusiness = ServiceFactory.GetLoginBusiness(); 
     somethingElse = //some method in another assembly that initializes the value 
     //... and so on, calling methods in other assemblies that initialize the private members... 

    } 

    public ActionResult SomeMethodIWantToTest(){ } 

}

alors, comment tous ces appels de méthode que j'isoler dans mon constructeur (donc je ne suis pas appeler des méthodes dans les o assemblées utres?)

Répondre

1

D'abord,

myController = new MyController(); 
A.CallTo(()=>myController.SomeMethodIWantToTest().Returns(someValueIAmTesting); 

se traduira par une erreur, comme A.CallTo ne gère que les appels à faux (et il devrait y avoir un ) supplémentaire après …ToTest()). Deuxièmement, l'approche générale adoptée dans ce type de situation est appelée Dependency Injection. Au lieu d'avoir une classe qui fait toutes ses dépendances (dans votre cas, en appelant des méthodes d'autres assemblys), vous avez ses dépendances.

En supposant que vous puissiez commencer à injecter des dépendances, vous êtes presque à la maison. Vous utilisez déjà des interfaces à l'intérieur de MyController, alors vous pouvez utiliser FakeItEasy pour fournir des contrefaçons à MyController, évitant ainsi les appels aux méthodes hors-ensemble.

+0

Merci. Cela répond parfaitement à la question. –

+0

@TimmyElliot: à la vôtre. –

Questions connexes