2 votes

Implémentation de simulation pour une utilisation dans les tests automatiques d'interface utilisateur.

Je travaille sur l'ajout de tests UI automatiques de base au bloc de tests unitaires que nous exécutons avec chaque build nocturne. Nous avons utilisé MSTest coded UI et créé un script.

Le code-behind dépend de IClientManager que le vrai manager et le mock implémentent tous les deux. Mon problème est que je ne sais pas comment passer automatiquement entre les implémentations réelles et les mocks à l'intérieur du gestionnaire de clic de bouton, lors de l'exécution d'un test.

Deux autres contraintes sont que je ne peux pas avoir de dépendance sur l'assembly de mock dans le code-behind et que je ne peux pas utiliser un framework DI, puisque le client est "sensible à la sécurité" et obtenir l'approbation d'un framework pourrait prendre des mois.

Y a-t-il un moyen de faire cela manuellement, et espérons-le, sans que ce soit un problème plus important que le problème que je cherche à résoudre?

Merci!

3voto

Jon Erickson Points 29643

Vous pourriez construire votre propre conteneur d'objets simple si vous ne pouvez pas utiliser un de tiers (ce qui est ridicule mais je comprends, j'ai été dans cette situation avant)

voici quelque chose que j'ai improvisé qui pourrait vous aider à démarrer... je ne l'ai pas testé et c'est vraiment approximatif, mais j'espère que vous comprenez l'idée

public static class ObjectFactory
{
    static IDictionary _factory = new Dictionary();

    public static void Register(Func builder)
    {
        if (_factory.ContainsKey(typeof(T)))
            _factory[typeof(T)] = builder;
        else
            _factory.Add(typeof(T), builder);
    }

    public static T GetInstance()
    {
        if (_factory.ContainsKey(typeof(T)))
            throw new ArgumentException(string.Format("Type <{0}> not registered in ObjectFactory", typeof(T).Name));

        return ((Func)_factory[typeof(T)])();
    }
}

public interface IClientManager { }
public class RealClientManager : IClientManager { }
public class MockClientManager : IClientManager { }

public class MyView
{
    public MyView()
    {
        // probably better to do this registry in some sort of application initialization
        ObjectFactory.Register(() => new RealClientManager());
    }

    public void SomeMethodThatNeedsClientManager()
    {
        var clientManager = ObjectFactory.GetInstance();
    }
}

public class MyTester
{
    [TestMethod()]
    public void SomeTest()
    {
        var view = new MyView();

        // swap the client manager in the test
        ObjectFactory.Register(() => new MockClientManager());

        // Asserts
    }
}

vous pouvez voir que si vous avez déjà utilisé StructureMap ou un autre conteneur d'injection de dépendances auparavant, ils font beaucoup de choses similaires avec beaucoup d'agrément supplémentaire comme parcourir votre graphe d'objets et enregistrer automatiquement des objets en fonction de conventions, gérer les cycles de vie des objets, la portée des conteneurs, etc... beaucoup de ces choses vous pourriez les implémenter vous-même aussi... mais vous devriez vraiment utiliser une solution éprouvée comme StructureMap

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X