Получение синглтона в сборке из запуска TestStack.White.Application

Я использую Teststack.White для запуска и взаимодействия с графическим интерфейсом. Модель скрыта за фасадом, что позволяет внедрить тестовый макет в графический интерфейс. Графический интерфейс успешно загружает тестовый макет, и Teststack.White может запустить приложение.

Как я могу получить доступ к моему синглтону с помощью Teststack.White.Application или подобных средств.

введите здесь описание изображения

    /*Singleton in Mock.DLL that will allow test configurations*/
    class Hook
    {
        public Hook SingleHook { get; private set; } = new Hook();
        private Hook() { }
    }

    /*Loader in Nunit so far*/

    private Application apploader()
    {
        ProcessStartInfo info = new ProcessStartInfo(@"C:\MyGUI\MYWPFGUI.exe");
        info.WorkingDirectory = (@"C:\MyGUI\");
        TestStack.White.Application app = Application.Launch(info);
        return app;
    }

В настоящее время я изучаю использование AppDomains, но, поскольку это приложение работает в своем выигранном процессе, я не вижу, как бы я это сделал. Мне нужно получить доступ к Singleton, чтобы настроить и оценить мои тесты.


person Johannes    schedule 20.01.2017    source источник
comment
Я не знаком с белым, но насколько я понимаю, вам нужен доступ к объектам другого процесса. Я думаю, вам нужно искать межпроцессное взаимодействие   -  person George Vovos    schedule 27.01.2017
comment
@GeorgeVovos Можете ли вы превратить свой комментарий в ответ? Я вознаградил бы его щедростью.   -  person Johannes    schedule 02.02.2017
comment
Я могу, но это был не очень хороший ответ ... Кроме того, подождите, если кто-то еще опубликует что-нибудь лучше   -  person George Vovos    schedule 02.02.2017
comment
@GeorgeVovos Я думаю, что IPC с использованием WCF Naming Pipes — это именно то, что мне нужно, поскольку я могу редактировать Mock.dll. У меня осталось 23 часа на мою награду, и я по немецкому времени, поэтому я буду бодрствовать, когда смогу установить награду через 23 часа.   -  person Johannes    schedule 02.02.2017


Ответы (2)


Я думаю, что единственный способ сделать это — использовать какой-то взаимодействие между процессами.

Есть много примеров на google здесь, на SO здесь или здесь

person George Vovos    schedule 02.02.2017

Вам нужно использовать отражение, первый шаг — загрузить сборку, содержащую класс Hook, с помощью Assembly.Load или Assembly.LoadFrom , затем вы используете методы Assembly.CreateInstance или Activator.CreateInstance или AppDomain.CreateInstanceAndUnwrap и передаете тип класса Hook, теперь вы не можете создать синглтон извне, а затем вызвать CreateInstance, чтобы создать его, поскольку он имеет частный ctor, в противном случае вам нужно использовать другие средства, такие как GetMethod и Invoke из типа Hook Singleton, чтобы получить доступ к его методам, что слишком много хлопот.

Тем не менее, я бы посоветовал вам создать класс как обычный класс и сохранить экземпляр singleton в тестовом приложении, поэтому обязательно пометьте свой класс Hook как общедоступный класс с общедоступным конструктором, а в тестовом проекте создайте общедоступное статическое свойство/переменная для хранения создал класс с отражением, а затем вы можете получить доступ к классу Singleton Hook в любом месте тестового приложения, просто вызвав статическое свойство.

person YazX    schedule 28.01.2017
comment
Перепрошивка dll мне ничего не даст. Видите ли, у другого процесса загружена dll. Если процесс тестирования также загружает сборку, оба в конечном итоге общаются с разными сборками, которые не подключены. - person Johannes; 30.01.2017
comment
ах, теперь я понимаю, что ж, если вы хотите использовать тот же класс, а не новый экземпляр из него, тогда вам нужно предоставить функциональные возможности из этого класса либо через COM +, сервисы (опция WCF net.tcp) или файловая система, в которой вы перетащите команды в файл, а в классе есть FileSystemWatcher (самый простой способ) для отслеживания изменений, затем прочитайте изменения и выполните необходимую процедуру. - person YazX; 02.02.2017