Ответ 1
Вместо использования
.Return(new Order());
Попробуйте использовать
.Do((Func<Order>)delegate() { return new Order(); });
Это вызовет делегат каждый раз, создав новый объект.
У меня есть этот код:
Expect.Call(factory.CreateOrder())
.Return(new Order())
.Repeat.Times(4);
Когда это вызывается четыре раза, каждый раз, когда возвращается тот же экземпляр. Я хочу, чтобы экземпляры разностей возвращались. Я хотел бы иметь возможность сделать что-то вроде:
Expect.Call(factory.CreateOrder())
.Return(() => new Order())
.Repeat.Times(4);
Можно ли это сделать каким-то образом?
Вместо использования
.Return(new Order());
Попробуйте использовать
.Do((Func<Order>)delegate() { return new Order(); });
Это вызовет делегат каждый раз, создав новый объект.
Повторите 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());
Патрик Стил предложил этот метод 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;
}