3

Ceci est une fonction exemple qui fonctionne avec une entité, l'enregistre dans une base de données et provoque ensuite des problèmes parce que nous ne pouvons pas écrire un test d'unité pour cela. Check it out:Comment tester une unité qui insère un enregistrement dans une base de données RIA Services?

// this class exists in a Silverlight Class Library 
public class EmployeeSaver 
{ 
    .... 

    public void Go() 
    { 
     Employee e = new Employee(); 

     e.Name="Jeremiah"; 

     ... // Other stuff that really needs to be tested 

     _DataContext.Employees.Add(e); 
     _DataContext.SubmitChanges(); 

    } 
} 

Parce que la nature des services RIA, un DomainService ne fonctionne pas à l'intérieur du cadre de tests unitaires Silverlight. Cela signifie que je n'ai pas accès à RIA lorsque je fais mes tests unitaires.

Nous avons pensé à des bases de données fantômes, mais cette classe crée en fait une entité (employé) à ajouter à la base de données. Ceci est problématique car les bases de données fantaisie n'utilisent pas cette entité mais une classe MockEntity qui ressemble à l'entité d'origine.

Nous n'essayons pas de tester RIA elle-même, mais comment nous utilisons les entités générées par RIA.

Mon objectif final serait d'écrire une fonction similaire à ceci:

[TestMethod] 
public void Test() 
{ 
    EmployeeSaver s = new EmployeeSaver(); 
    s.Go(); 

    Assert.IsEqual(DataContext.Employees.Last().Name, "Jeremiah"); 
} 

Comment puis-je tester cette fonction? Quel cadre de test dois-je utiliser? Suis-je loin d'utiliser le Silverlight Testing Framework?

+0

difficile un ...... :( –

+0

tester plusieurs niveaux n'est jamais facile ... simuler, tester séparément, ou reconsidérer? –

Répondre

2

Dans votre test unitaire, instance doit avoir une implémentation stubbed de _DataContext Lorsque la méthode Go est appelée, elle appelle: _DataContext.Employees. Ajouter (e); _DataContext.SubmitChanges(); il appellera dans votre talon le talon devrait alors enregistrer le fait qu'un employé a obtenu ajouté et les changements ont été soumis

Après l'appel à Go, vous sho.. Uld interroger le talon pour s'assurer que le nouvel employé a été ajouté, et l'appel à SubmitChanges s'est produit.

Comme une note secondaire: Je ne suis pas vraiment d'accord avec la dernière partie de l'autre réponse en ce que vous ne devriez pas se soucier si Go appelle diverses méthodes de _DataContext. Il est vrai que vous n'êtes pas concerné par le test des méthodes _DataContext ici, mais le test unitaire de Go doit garantir que la méthode Go appelle correctement les méthodes _DataContext. La logique est que chaque ligne de la méthode Go devrait être testable. Si vous n'avez pas effectué cette vérification, vous pouvez supprimer les appels à la méthode _DataContext, en brisant le code, mais le test unitaire ne l'attrape pas. Cela briserait le principe des «trois règles de TDD» de Bob Martin.

1

Une base de données simulée à la main pourrait stocker votre objet tel quel. Nous utilisons un tel système où les dépôts sont stockés dans des dictionnaires de.

Vous n'avez même pas besoin d'aller si loin. Vous pourriez simplement utiliser une fausse interface pour le _DataContext avec quelque chose comme RhinoMocks pour vous assurer que les méthodes que vous attendez d'être appelées étaient (ce n'est pas votre problème pour ce test que _DataContext.SubmitChanges() fonctionne (ce serait le test unitaire)

Questions connexes