Макетная реализация для использования в автоматическом тестировании пользовательского интерфейса - PullRequest
2 голосов
/ 22 ноября 2011

Я работаю над добавлением базовых автоматических тестов пользовательского интерфейса в блок модульных тестов, которые мы запускаем при каждой ночной сборке. Мы использовали кодированный пользовательский интерфейс MSTest и создали скрипт.

Код программы зависит от IClientManager, который реализован как настоящим менеджером, так и имитатором. Моя проблема в том, что я не знаю, как автоматически переключаться между реальной и фиктивной реализациями внутри обработчика нажатия кнопки при запуске теста.

Двумя другими моими ограничениями являются то, что у меня не может быть зависимости от фиктивной сборки в выделенном фрагменте кода, и что я не могу использовать инфраструктуру DI, так как клиент "заботится о безопасности" и может получить одобренную среду занять месяцы.

Есть ли способ сделать это вручную, и, надеюсь, не большая проблема, чем проблема, которую я ищу, решить?

Спасибо!

1 Ответ

3 голосов
/ 22 ноября 2011

Вы можете создать свой собственный простой объектный контейнер, если вы не можете использовать сторонний (что глупо, но я понимаю, я был там раньше)

вот что я подхватил,мог бы начать ... не проверял, и это действительно грубо, но, надеюсь, вы поняли идею

public static class ObjectFactory
{
    static IDictionary<Type, object> _factory = new Dictionary<Type, object>();

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

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

        return ((Func<T>)_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<IClientManager>(() => new RealClientManager());
    }

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

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

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

        // Asserts
    }
}

, вы можете увидеть, что если вы использовали StructureMap или какой-либо другой контейнер DI до того, как ониДелайте то же самое со множеством дополнительных тонкостей, таких как обход графа объектов и автоматическая регистрация объектов на основе соглашений, управление жизненным циклом объектов, определение области действия контейнеров и т. д. - многое из этого вы также можете реализовать самостоятельно.... но вы просто должны использовать проверенное и верное решение, такое как StructureMap

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...