从 运行 TestStack.White.Application 获取程序集中的单例

Getting a Singleton in an Assembly from running TestStack.White.Application

我正在使用 Teststack.White 启动 GUI 并与之交互。 模型隐藏在外观后面,允许将测试模拟注入到 GUI 中。 GUI 成功加载测试模拟并且 Teststack.White 可以启动应用程序。

如何使用 Teststack.White.应用程序或此类方式访问我的单例。

    /*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 才能设置和评估我的测试。

您需要使用反射,第一步是使用 Assembly.Load 或 Assembly.LoadFrom 加载包含 Hook class 的程序集,然后使用 Assembly.CreateInstance或 Activator.CreateInstance 或 AppDomain.CreateInstanceAndUnwrap 方法并传递 Hook class 类型,现在您不能从外部创建单例然后调用 CreateInstance 来创建它,因为它具有私有 ctor,否则您需要使用其他方法如GetMethod和Invoke从Hook Singleton类型访问它的方法太麻烦了。

但是,我建议您正常创建 class class 并在测试应用程序中保留一个单例实例,因此请确保将您的 Hook class 标记为 public class 使用 public 构造函数并在测试项目中创建一个 public static property/variable 以通过反射保存创建的 class 然后您可以访问 Singleton只需调用静态 属性.

即可在测试应用程序的任何位置挂钩 class

我认为唯一的方法是使用某种 inter process communication.

google on here on SO here or here

上有很多例子