C# 使用AppDomain为单元测试提供应用程序调度程序

C# 使用AppDomain为单元测试提供应用程序调度程序,c#,unit-testing,C#,Unit Testing,问题:运行单元测试时,类中的Application.Current为null 解决方法:创建一个将运行我的测试类的应用程序域。应用程序域将为我的测试类提供一个调度程序 代码示例: MyClassInTheAssembly myClass; string path = @"C:\\pathToTheDll\\MyAssembly.dll"; path = path.Replace(@"\\", @"\"); AppDomainSetu

问题:运行单元测试时,类中的Application.Current为null

解决方法:创建一个将运行我的测试类的应用程序域。应用程序域将为我的测试类提供一个调度程序

代码示例:

        MyClassInTheAssembly myClass;
        string path = @"C:\\pathToTheDll\\MyAssembly.dll";
        path = path.Replace(@"\\", @"\");
        AppDomainSetup setup = new AppDomainSetup { PrivateBinPath = path };
        AppDomain domain = AppDomain.CreateDomain("MyDomain", null, setup);

        myClass = (MyClassInTheAssembly)domain.CreateInstanceFromAndUnwrap(path, typeof(MyClassInTheAssembly).FullName);
myClass对象可用于单元测试使用Application.Current.Dispatcher的任何公共方法

在myClass上执行单元测试时,我收到以下错误:

找不到类型为“MyAssembly.MyClassInTheAssembly”的构造函数

调用domain.CreateInstanceFromAndUnwrap()方法以创建我的测试类的实例时生成此错误

MyClassInTheAssembly构造函数有两个必需的参数。是否可以使用参数创建类的AppDomain实例

更新 感谢用户779967为我指明了正确的方向。以上问题的答案是对AppDomain.CreateInstanceFromAndUnwrap()使用方法重写。 我尝试使用方法重写使用AppDomain创建测试类的实例:

        object[] parameters = new object[2];  // object array to pass my required parameters.
        parameters[0] = container;  // Required constructor param for myClass.
        parameters[1] = eventAggregator;  // Required constructor param for myClass.
        myClass = (MyClassInTheAssembly)domain.CreateInstanceFromAndUnwrap(path, typeof(MyClassInTheAssembly).FullName, true, BindingFlags.Default, null, parameters, null, null);
其想法是使用此方法重写将所需参数传递给测试类的实例化。然后,我可以使用从AppDomain派生的测试类,它为我的所有单元测试提供了一个调度程序线程

执行此代码时,我收到以下SerializationException:未解析成员“Castle.DynamicProxy.Serialization.ProxyObjectReference,NSSubstitute,Version=1.6.1.0,Culture=neutral,PublicKeyToken=92dd2e9066daa5ca”的类型。这是因为我需要使用NSubstitute对容器和eventaggregator类进行单元测试。AppDomain方法正在为我的构造函数参数类型(而不是NSSubstitute)查找IUnityContainer和IEventaggGator的精确参数类型匹配

我放弃了使用AppDomain为单元测试实例化测试类的尝试。我决定在我的测试类方法中处理Application.Current,如下所示:

        var dispatcher = Application.Current != null ? Application.Current.Dispatcher : Dispatcher.CurrentDispatcher;

        if (dispatcher.CheckAccess())
        {
            do something....
        }
        else dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => CallMethodAgain())); 
在生产环境中运行代码时,Application.Current不应为null。在运行单元测试代码时,我使用Dispatcher.CurrentDispatcher从执行线程创建一个Dispatcher


如果有人有一个很好的实现,可以使用AppDomain实例化一个类进行单元测试,我很乐意看到它

检查此重载版本的CreateInstanceAndUnwrap


似乎需要创建object[]类型的数组,并用构造函数参数填充它

多谢各位。这条建议为我指明了正确的方向。在我的原始问题中查看我的更新。