RhinoMock: как заглушить и вернуть метод со сложным объектом в качестве параметра - PullRequest
6 голосов
/ 14 октября 2011

Я очень ценю, что любой может помочь мне в упомянутой ниже проблеме: я использую RhinoMock в модульном тесте.Я определяю мой фиктивный объект таким образом, с sessionToken имеет строковый тип:

mockRepository.Stub(repository => repository.FindById(sessionToken)).Return(new DeviceTypeRepository().NewTable(false));

Это нормально для секции кода при вызове FindById () для возврата valid new new DeviceTypeRepository (). NewTable (false);

Однако при включении сложного параметра как объекта, такого как DataTable, в заглушку, как показано ниже:

mockRepository.Stub(repository => repository.Find(sessionToken, dataTable)).Return(new DeviceTypeRepository().NewTable(false));

Тогдасекция кода, в которой вызывается Find () , она NOT возвращает ожидаемый новый DeviceTypeRepository (). NewTable (false).Обратите внимание, что входное значение параметра dataTable одинаково как в Stub, так и в вызове Find ().

Следовательно, мой вопрос: как я могу реализовать такой параметр (типизированный в DataTable и в более общем смысле) в инициализации Stub с помощью RhinoMock?Буду благодарен любому совету и подходу.Спасибо

Ответы [ 2 ]

9 голосов
/ 14 октября 2011

Я считаю, что проблема не в сложном типе данных, а в ожидаемых вами ожиданиях.

В качестве первой попытки исправить это, добавьте IgnoreArguments() перед Return.Возможно, DataTable, указанное вами в ожидании, отличается от фактически переданного экземпляра DataTable, поэтому ожидания не пройдут:

...Stub(...).IgnoreArguments().Return();

Если не помогло, вы можете отладить его вручную, используяWhenCalled ():

...Stub(...).IgnoreArguments().WhenCalled(
    mi => 
    {
        var token = mi.Arguments[0] as TokenDataType;
        var dataTable = mi.Arguments[1] as DataTable;
    }).Return();

Если это не поможет, попробуйте добавить Repeat().Any() после Return() и посмотреть, работает ли он.Я полагаю, что если метод вызывался несколько раз, возможно, вы пропустили первое возвращаемое значение, но я могу ошибаться.

6 голосов
/ 15 октября 2011

Если он не возвращает ожидаемого, то параметры между вызовом-заглушкой и фактическим вызовом не совпадают. Допустим, у вас есть что-то вроде этого:

// Set expectations
var someDataTable = new DataTable(columns, raws);
mockRepository
   .Stub(repository => repository.Find(sessionToken, dataTable))
   .Return(new DeviceTypeRepository().NewTable(false));

// Actual test
var anotherDataTable = new DataTable(columns, raws);
yourTestObject.DoSomethingThatLooksForTheDataTable(repository);

Дело в том, что, хотя someDataTable и anotherDataTable имеют одинаковое содержимое, они не являются одним и тем же объектом, и когда RhinoMocks сравнивает вызов-заглушку с фактическим вызовом, параметры не совпадают. Что вы можете сделать, это использовать ограничения:

mockRepository
   .Stub(repository => repository.Find(
      Arg<SessionID>.Matches(y => y.ID == 2),
      Arg<DataTable>.Matches(x => x.Columns == columns && x.Raws == raws)
   ))
   .Return(true);
...