使用反射(PrivateObject)进行测试

本文关键字:测试 PrivateObject 反射 | 更新日期: 2023-09-27 18:16:44

我有一个小问题,但相当恼人。

我正在使用PrivateObject访问类中的各种方法进行一些测试。这一切都很好。然而,当方法签名包含"ref"时,ref关键字似乎没有任何影响。

private bool NewDeviceArrivedDeviceAtWorkcenter(ThreadStartArgs args, ref Device deviceAtStation)
{
//..SomeCode
     deviceAtStation = null;
//...Method to test
}

这个测试失败了。

 [TestMethod]
        public void CheckForDeviceAtWorkcenterNoDeviceFound()
        {
Initialization omitted
var device = new Device();
            var result = accessor.Invoke("NewDeviceArrivedDeviceAtWorkcenter", 
                new []
                    {
                        typeof (ThreadStartArgs), 
                        typeof (Device).MakeByRefType()
                    }, 
                    new object[] 
                    {
                        threadStartArgs, 
                        device
                    });
            Assert.IsNull(device);
}

问题:为什么测试方法中的device obj没有设置为null?

感谢您的帮助

亲切的问候Carsten

使用反射(PrivateObject)进行测试

通过传入Invoke的参数数组进行返回。

[TestMethod]
public void CheckForDeviceAtWorkcenterNoDeviceFound()
{ 
   //Initialization omitted for publicObject, threadStartArgs, device
   Type[] myTypes = new Type[] {typeof (ThreadStartArgs), 
                                typeof (Device).MakeByRefType() };
   object[] myArgs = new object[] { threadStartArgs, device };
   string sMethod = "NewDeviceArrivedDeviceAtWorkcenter";
   //Invoke method under test
   bool bResult = (bool)publicObject.Invoke(sMethod, myTypes, myArgs);
   Device returnDevice = (Device)myArgs[1];
   Assert.IsNull(returnDevice);
}

根据此回复,您应该获得您想要测试的方法的MethodInfo,并仅使用参数数组调用它。

您是否尝试过仅用typeof(Device)调用该方法,而不调用MakeByRefType() ?