Question

J'essaie d'effectuer des tests unitaires en utilisant la méthode suivante pour tester les unités VS.

void Get(string name, Action<string> callBack);

voici le testeur d'unité

    [TestMethod]
    public void Test()
    {
        Action<string> cb = name =>
        {
            Assert.IsNotNull(name);
        };

        var d = new MyClass();
        d.Get("test", cb);
    }

Le seul problème est que l'implémentation interne utilise BackgroundWorker, le rappel est donc appelé sur un autre thread. Voici la mise en œuvre interne.

    public void Get(string name, Action<string> callBack)
    {
        callBackString = callBack;
        GetData(name);
    }  

    private void GetData(string name)
    {
        BackgroundWorker bw = new BackgroundWorker();
        bw.DoWork += bw_DoWork;
        bw.RunWorkerCompleted += bw_RunWorkerCompleted;
        bw.RunWorkerAsync(name);
    }

    private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        //do work here
        if (null != callBackString)
            callBackString("ok");
    }

Bien sûr, étant donné que Get () est renvoyé immédiatement, que le test se termine avec succès et que le test s’arrête, RunWorkerCompleted n’est jamais exécuté. Je peux facilement tester cela via une application normale (WPF) car il continue de fonctionner, mais j'aimerais pouvoir effectuer des tests unitaires.

Des idées? Merci d'avance.

Était-ce utile?

La solution

Quelque chose comme:

[TestMethod]
public void Test()
{   
    bool running = true;
    string result = null;

    Action<string> cb = name =>
    {
        result = name;
        running = false;
    };

    var d = new MyClass();
    d.Get("test", cb);

    while(running)
    {
        Thread.Sleep(100);
    }

    Assert.IsNotNull(result);
}

Bien que vous souhaitiez probablement ajouter quelque chose pour empêcher le test de fonctionner à tout jamais s'il échoue ...

Autres conseils

Je ne connais pas les détails de C # & amp; BackgroundWorker, mais je le ferais en injectant l'implémentation BackgroundWorker et lors du test, utilisez un BackgroundWorker à capuchon que vous pouvez contrôler quand il est exécuté et dans quel thread. Si la communication entre deux threads est requise, demandez à BackgroundWorker créé de créer un nouveau thread et laissez le test suspendu jusqu'à la fin. Sinon, forcez-le à s'exécuter après l'appel à obtenir.

J'ai écrit un code similaire et l'ai rendu testable en suivant le conception IAsyncResult motif . Mes tests unitaires sont exécutés sur la version synchrone (bloquante) de la méthode. Les méthodes asynchrones peuvent être une seule ligne chacune, donc je n'ai pas écrit de tests unitaires contre celles-ci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top