Тестирование с использованием отражения (PrivateObject) - PullRequest
1 голос
/ 05 декабря 2011

У меня небольшая, но довольно раздражающая проблема.

Я провожу некоторые тесты, используя 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);
}

Вопрос: Почему устройство является объектомв методе теста не установлено значение null?

Любая помощь приветствуется

С уважением, Карстен

Ответы [ 2 ]

1 голос
/ 01 мая 2012

Возвращение производится через массив аргументов, переданный в 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);
}
0 голосов
/ 06 декабря 2011

Согласно этому ответу вы должны получить MethodInfo метода, который вы хотите протестировать, и вызвать его только с массивом параметров.

Вы пытались вызвать метод только с typeof(Device) без звонка MakeByRefType()?

...