Подтвердить что ты не робот

Возвращать разные экземпляры для каждого вызова с использованием носорогов

У меня есть этот код:

Expect.Call(factory.CreateOrder())
    .Return(new Order())
    .Repeat.Times(4);

Когда это вызывается четыре раза, каждый раз, когда возвращается тот же экземпляр. Я хочу, чтобы экземпляры разностей возвращались. Я хотел бы иметь возможность сделать что-то вроде:

Expect.Call(factory.CreateOrder())
    .Return(() => new Order())
    .Repeat.Times(4);

Можно ли это сделать каким-то образом?

4b9b3361

Ответ 1

Вместо использования

.Return(new Order());

Попробуйте использовать

.Do((Func<Order>)delegate() { return new Order(); });

Это вызовет делегат каждый раз, создав новый объект.

Ответ 2

Повторите 4 раза ваше ожидание, указав другое возвращаемое значение каждый раз (обратите внимание на Repeat.Once())

for (int i = 0; i < 4; i++)
   Expect.Call(factory.CreateOrder()).Repeat.Once().Return(new Order());

ОБНОВЛЕНИЕ: Я считаю, что следующее будет работать:

Expect.Call(factory.CreateOrder())
  .Repeat.Once().Return(new Order())
  .Repeat.Once().Return(new Order())
  .Repeat.Once().Return(new Order())
  .Repeat.Once().Return(new Order());

Ответ 3

Патрик Стил предложил этот метод extenstion:

public static IMethodOptions<T> Return<T>(this IMethodOptions<T> opts, Func<T> factory)
{
    opts.Return(default(T));
    opts.WhenCalled(mi => mi.ReturnValue = factory());
    return opts;
}

Подробнее см. в его записи в блоге.