2009-11-13 5 views
0

Je cherche quelques exemples sur la façon de faire les tests simulés suivants en utilisant StructureMap ou Unity avec NUnit.StrucutureMap RhinoMock Enregistrement/Lecture, Exemple nécessaire

J'ai la structure de code suivant

public interface IDAL 
{ 
    List<Model> Method1(int id); 
} 

public class DAL : IDAL 
{ 
    public List<Model> Method1(int id) 
    { 
     List<Model> retval = new List<Model>(); 
     DbCommand cmd = GetStoredProcCommand("Model_Method1"); 
     using (IDataReader dr = DB.ExecuteReader(cmd)) 
     { 
      LoadEntityBaseList(retval, dr, PopulateDomain);//populate list based on reader 
     } 
     return retval; 
    } 
} 

public class Manager 
{ 
    private readonly IDAL m_DAL; 
    public Manager()  
    { 
     ObjectFactory.Initialize(x => x.ForRequestedType<IDAL>()); 
     m_DAL = ObjectFactory.GetInstance<IDAL>(); 

    } 

    public List<Domain> Method1(int id) 
    { 
     return m_DAL.Method1(id); 

    } 
} 

[TestFixture] 
public class ManagerTests 
    [Test] 
    public void Method1_Calls_DAL() 
    { 

     var list = new List<Model>(); 
     using (m_mock.Record()) 
     { 
      Expect.Call(_dal.Method1(1)).IgnoreArguments().Return(list); 
     } 
     using (m_mock.Playback()) 
     { 
      Manager manager = new Manager(); 
      var actual = manager.Method1(1); 
      Assert.That(actual, Is.Not.Null); 
     } 
    } 
} 

Si j'inclure la configuration StructureMap Il ne tient pas compte de la Mock et Rhino.Mocks.MockRepository.VerifyAll() renvoie une exception.

Si je n'inclue pas la configuration de structureMap, aucune instance par défaut n'est définie pour PluginFamily MyObject.IDAL. Est-ce que quelqu'un peut me diriger dans la bonne direction sur ce que je fais mal?

Répondre

1

ObjectFactory.Initialize ne doit être appelé qu'une seule fois pendant la durée de vie de votre application, il est donc inutile de l'appeler depuis un constructeur de classe.

Placez la méthode ObjectFactory.Initialize() quelque part au début de votre programme (Main() ou Application_Start() pour le web) puis changez Manager pour qu'il prenne un IDAL comme argument constructeur. vous passez juste un IDAL moquaient Manager -

ObjectFactory.Initialize(...) 
var manager = ObjectFactory.GetInstance<Manager>(); 

public class Manager { 
public Manager(IDAL dal){ 
    m_DAL = dal; 
} 
... 
} 

Ensuite, dans votre test unitaire, vous n'utilisez pas StructureMap du tout.

using (m_mock.Playback()) { 
Manager manager = new Manager(m_mock); 
+0

Oui cela fonctionnera mais je essaie d'éviter boîtier spécial le constructeur juste pour test du modèle – Brian

+0

Ce n'est pas un cas particulier. C'est ainsi que vous devez concevoir vos classes lorsque vous travaillez avec un outil IOC comme StructureMap. –

Questions connexes