2017-10-19 23 views
0

Je développe un projet de test avec NUnit, Moq, C# et .NET Framework 4.7.Utilisation de génériques dans l'expression lambda ou comment accéder à un dbset avec des génériques

J'ai ces deux méthodes qui sont presque égale:

using Microsoft.EntityFrameworkCore; 
using Moq; 
using NUnit.Framework; 
using System; 
using System.Collections.Generic; 
using System.Linq; 

private void MockProducts(Mock<TRZFDbContext> mockContext, List<Product> data) 
{ 
    IQueryable<Product> queryable = data.AsQueryable(); 

    var mockSet = new Mock<DbSet<Product>>(); 

    mockSet.As<IQueryable<Product>>().Setup(m => m.Provider).Returns(queryable.Provider); 
    mockSet.As<IQueryable<Product>>().Setup(m => m.Expression).Returns(queryable.Expression); 
    mockSet.As<IQueryable<Product>>().Setup(m => m.ElementType).Returns(queryable.ElementType); 
    mockSet.As<IQueryable<Product>>().Setup(m => m.GetEnumerator()).Returns(() => queryable.GetEnumerator()); 
    mockSet.Setup(d => d.Add(It.IsAny<Product>())).Callback<Product>((s) => data.Add(s)); 
    mockSet.Setup(d => d.Remove(It.IsAny<Product>())).Callback<Product>((s) => data.Remove(s)); 

    mockContext.Setup(m => m.Product).Returns(mockSet.Object); 
} 

private void MockEmvoProducts(Mock<TRZFDbContext> mockContext, List<EmvoProduct> data) 
{ 
    IQueryable<EmvoProduct> queryable = data.AsQueryable(); 

    var mockSet = new Mock<DbSet<EmvoProduct>>(); 

    mockSet.As<IQueryable<EmvoProduct>>().Setup(m => m.Provider).Returns(queryable.Provider); 
    mockSet.As<IQueryable<EmvoProduct>>().Setup(m => m.Expression).Returns(queryable.Expression); 
    mockSet.As<IQueryable<EmvoProduct>>().Setup(m => m.ElementType).Returns(queryable.ElementType); 
    mockSet.As<IQueryable<EmvoProduct>>().Setup(m => m.GetEnumerator()).Returns(() => queryable.GetEnumerator()); 
    mockSet.Setup(d => d.Add(It.IsAny<EmvoProduct>())).Callback<EmvoProduct>((s) => data.Add(s)); 
    mockSet.Setup(d => d.Remove(It.IsAny<EmvoProduct>())).Callback<EmvoProduct>((s) => data.Remove(s)); 

    mockContext.Setup(m => m.EmvoProduct).Returns(mockSet.Object); 
} 

je peux créer une méthode de génériques changer le deuxième argument data avec un générique. Mais mon problème est sur la dernière phrase:

mockContext.Setup(m => m.Product).Returns(mockSet.Object); 

et

mockContext.Setup(m => m.EmvoProduct).Returns(mockSet.Object); 

m.Product est un DbSet de Product et m.EmvoProduct est un DbSet de EmvoProduct.

Existe-t-il un moyen de faire en sorte que l'expression lambda utilise les génériques? Ou peut-être existe-t-il d'autres approches.

+0

fondamentalement vous voulez créer la fonction de configuration? –

+0

Oui. Mais la question est de savoir comment en faire des génériques. Peut-être que je dois déplacer la dernière phrase à l'extérieur comme ils l'ont fait ici: https://www.rhyous.com/2015/04/10/how-to-mock-an-entity-framework-dbcontext-and-its-dbset- propriétés/ – VansFannel

+0

quel numéro de ligne dans le lien? –

Répondre

1

Vous devriez être en mesure de le faire avec une fonction d'extension qui est déclaré quelque chose comme ça dans un public static class

public static class DBSetExtensions { 

    public static void Setup<T>(this DbSet<T> list, Action<T> lamda){ 
     lamda(objectFromDbSet); 
    } 

} 

Maintenant dans toutes les classes que vous avez un DbSet avec les génériques, vous devriez être en mesure de utiliser

mockSet.Setup(d => d.Add(It.IsAny<EmvoProduct>())) 

pour la fonction chaîne Callback, vous devez changer le type de retour sur la fonction ci-dessus de vide à tout objet de leur retour dans la configuration.

+0

Pourriez-vous s'il vous plaît ajouter un exemple sur comment utiliser votre réponse? Merci. – VansFannel

+0

Je l'ai mis à jour. Tant qu'il s'agit d'une fonction statique, il fonctionnera partout où vous utilisez un objet DBSet –