2017-10-02 5 views
2

J'essaie d'écrire des tests unitaires mais j'ai du mal à trouver comment déléguer des fonctions.Comment écrire ces tests unitaires?

L'application est une application MVC et les tests unitaires dépendent des données moc (ils n'utilisent pas la base de données).

Nous avons apporté une modification à l'un de nos services, et maintenant les tests unitaires qui testent ce service échouent. L'ajustement que je dois faire aux tests unitaires ne semble pas fonctionner, et c'est ce dont j'ai besoin d'aide.

Tout d'abord, voici comment cela a fonctionné avant le changement:

La fonction au service à tester:

public Project GetProject(int projectId) 
{  
    return _context.Projects.Find(projectId);  
} 

Substituer la fonction de délégué dans nos tests unitaires:

protected override void Given() 
{ 
    GetMockFor<IRiskAliveContext>()  
    .Setup(ctx => ctx.Projects.Find(1))  
    .Returns(GetTestProject(1)); 
} 

Donc, essentiellement, nous disons que chaque fois que le service appelle context.Projects.Find(1), retourner le projet de simulation de GetTestProject(1).

Cela a bien fonctionné jusqu'à ce que nous avons fait notre changement:

public Project GetProject(int projectId) 
{ 
    return _context.Projects.Include("Report").FirstOrDefault(p => p.ProjectId == projectId);  
} 

Il ne semble pas que nous pouvons substituer une fonction de délégué aux appels à context.Projects.Include("report").FirstOrDefault(...), du moins pas de la même manière que context.Project.Find(...). Lorsque je tente de remplacer la fonction comme suit, je reçois un NotSupportedException

protected override void Given() 
{  
    GetMockFor<IRiskAliveContext>()  
    .Setup(ctx => ctx.Projects.Include("Report").FirstOrDefault(p => p.ProjectId == 1)) 
    .Returns(GetTestProject(1)); 
} 

est-il une autre façon de substituer une fonction de délégué lorsque l'appel est à ... Inclure (...). FirstOrDefault (.. .)?

+1

Vous essayez de méthodes d'extension simulées, ce qui est pas disponible dans le cadre moqueur utilisé. – Nkosi

+2

Veuillez ajouter un peu de contexte - Quelle langue (C#?)? De plus, quels frameworks utilisez-vous? Par exemple, 'GetMockFor' vient d'où? Quels paquets avez-vous installés? – LightCC

+0

La question dans son état actuel n'est pas claire car elle est incomplète. Lisez [ask] puis fournissez un [mcve] qui peut être utilisé pour mieux comprendre votre problème. – Nkosi

Répondre

0

Pour ce genre de méthode, j'aime simuler la collection (ctx.Projects dans ce cas), puis ajouter une variété de données à cette collection pour vérifier que les filtres corrects sont appliqués. Par exemple, dans votre cas, j'ajouterais les autres projets qui ont des ProjectId s différents et je confirmerai que seul le bon projet est retourné car ce type de test apportera beaucoup plus de valeur et vous devriez pouvoir vous moquer de cela plus facilement.

Je ne vais pas entrer dans les détails de la façon de se moquer du DbSet ou du Include car ils ont été répondu à d'autres questions. Ces questions devraient être un bon point de départ:

How to add an item to a Mock DbSet (using Moq)

Moqing Enity Framework 6 .Include() using DbSet<>