2

Je dois écrire une couche de test pour tester ma couche de service de domaine RIA WCF qui est construite au-dessus du contexte Entity Framework. J'ai rencontré certains modèles qui suggèrent d'utiliser un référentiel, puis utiliser la fabrique de service de domaine pour intiliser le service de domaine avec une instance de référentiel à utiliser. Un des exemples qui correspond à l'exigence est expliqué ici sur le blog de Vijay (http://blogs.msdn.com/vijayu/archive/2009/06/08/unit-testing-business-logic-in-net-ria-services.aspx). Le problème avec cette implémentation est qu'elle n'initie le référentiel que pour un objet de domaine spécifique, par ex. Client/Produit mais il ne fournit aucun moyen de créer un référentiel qui puisse retourner n'importe quel objet que je voudrais retourner.Comment écrire un référentiel Mock pour tester la construction du service de domaine RIA WCF au-dessus du contexte Entity Framework

S'il vous plaît suggérer quelle est la bonne façon de le faire et si c'est possible ou non.

Merci à l'avance,

Manoj

Répondre

1

Je suis contourner ce problème en élargissant l'échantillon avec un objet RepositoryCollection qui instancie automatiquement LinqToSqlRepositories au besoin, et permet également l'insertion des dépôts simulacres/stub manuellement tests unitaires.

public class RepositoryCollection : IDisposable 
{ 
    private Dictionary<Type, object> _repositories = new Dictionary<Type, object>(); 
    private DataContext _context; 

    public RepositoryCollection() { } 

    public RepositoryCollection(DataContext context) 
    { 
     _context = context; 
    } 

    public IRepository<T> Get<T>() where T : class 
    { 
     if(!_repositories.ContainsKey(typeof(T))) 
      _repositories.Add(typeof(T), new LinqToSqlRepository<T>(_context)); 

     return _repositories[typeof(T)] as IRepository<T>; 
    } 

    public RepositoryCollection Insert<T>(IRepository<T> repository) where T : class 
    { 
     _repositories[typeof(T)] = repository; 
     return this; 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    public void SubmitChanges() 
    { 
     if (_context != null) 
      _context.SubmitChanges(); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      if(_context != null) 
       _context.Dispose(); 
     } 
    } 
} 

Ensuite, dans votre service de domaine, vous l'utilisez comme ceci:

private RepositoryCollection _repositoryCollection; 

public MyDomainService(RepositoryCollection repositoryCollection = null) 
{ 
    _repositoryCollection = repositoryCollection ?? new RepositoryCollection(new MyDataContext()); 
} 

public IQueryable<Customer> GetCustomers() 
{ 
    return _repositoryCollection.Get<Customer>().Query(); 
} 

public IQueryable<Product> GetProducts() 
{ 
    return _repositoryCollection.Get<Product>().Query(); 
} 

.. other methods go here ...