2016-08-22 1 views
0

J'essaie de tester le comportement d'une classe, lorsqu'elle est passée à un objet de raccord via une fabrique de délégués. J'ai fait une version du test dans laquelle toutes les dépendances de la classe (sauf l'usine) sont passées en tant qu'objets Mock et cela fonctionne comme prévu. Maintenant j'essaye d'employer AutoMock pour obtenir le conteneur pour créer automatiquement les simulacres.Utilisez mock.Provide() pour configurer une fabrique de délégués, utilisée dans le constructeur SUT

Je rencontre des problèmes en transmettant des valeurs concrètes pour la fabrique de délégués dans le constructeur de ClassUnderTest à l'aide de mock.Provide(). (Comme this comment suggère)

classe que je teste:

public ClassUnderTest 
{ 
private readonly firstField; 
private readonly Func<string, ISecondField, IThirdField, IResultField> resultFieldFactory; 
private int someCounter = -1; 

public ClassUnderTest(IFirstField firstField, Func<string, ISecondField, IThirdField, IResultField> resultFieldFactory) 
{ 
    this.firstField = firstField; 
    this.resultFieldFactory= resultFieldFactory; 
} 

public methodToTest() 
{ 
    IResultField resultField = resultFieldFactory(someString, secondFieldValue, thirdFieldValue); 
    resultField.AddToList(); 
} 
} 

module logique métier:

public class BusinessLogicModule: Module 
{ 
//some other things that work 

builder.RegisterType<ClassUnderTest>().As<IClassUnderTest>(); 
builder.RegisterType<SecondField>().As<ISecondField>(); 
builder.RegisterType<ThirdField>().As<IThirdField>(); 
builder.RegisterType<ResultField>().As<IResultField>(); 

} 

classe Test:

[TestClass] 
public class TestClass() 
{ 
private IFirstField firstField; 
private Func<string, ISecondField, IThirdField, IResultField> funcToTriggerIResultFieldFactory; 


[TestInitialize] 
public void Setup() 
{ 
    this.firstField= Resolve<IFirstField>(); 
    this.secondField= Resolve<ISecondField>(); 
    this.funcToTriggerIResultFieldFactory = Resolve<Func<string, ISecondField, IThirdField, IResultField>>(); 
} 


[TestMethod] 
public void testMethodWithAutoMock() 
{ 
    using (var automock = AutoMock.GetLoose()) 
    { 
    //trying to setup the SUT to get passed a "concrete" object 
    autoMock.Provide(funcToTriggerIResultFieldFactory(stringValue, secondFieldValue, thirdFieldValue)); 

    var sut = autoMock.Create<IClassUnderTest>; 

    sut.MethodToTest(); 
    //asserts 
    } 
} 

}

I wo Je serais reconnaissant pour toute indication sur ce que je fais mal. Qu'est-ce que je rate? Comment pourrait-il être réparé? Est-ce une simple correction de syntaxe ou quelque chose ne va pas avec mon approche de ce test?

Merci d'avance pour votre temps.

+0

Habituellement, vous utilisez des bibliothèques fictives pour simuler les dépendances, pas essayer et ajouter des simulacres à un conteneur DI car il y a trop de parties mobiles. Vos tests devraient être très spécifiques à cette classe, donc vous n'auriez besoin que de quelques simulacres (le cas échéant) –

+0

Cela ne devrait-il pas être autoMock.Create au lieu de IClassUnderTest? Quel est le problème réel? Obtenez-vous une compilation ou une erreur d'exécution? – suwik

+0

Donc je l'ai changé pour "autoMock.Create ". Je reçois une exception System.NullReferenceException lorsque j'appelle sut.MethodToTest(). resultFieldFactory (someString, secondFieldValue, thirdFieldValue) –

Répondre

0

Dans votre exemple, lorsque vous appelez autoMock.Provide(), vous ne transmettez pas votre fonction d'usine, mais vous appelez la fonction d'usine et transmettez le résultat (IResultField). Pour résoudre ce problème, appelez

autoMock.Provide(funcToTriggerIResultFieldFactory); 

Here est un exemple complet d'enregistrement d'une fonction avec le conteneur moqueur automatique.