Вернуть разные экземпляры для каждого вызова, используя насмешки носорога - PullRequest
12 голосов
/ 28 января 2011

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

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

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

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

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

Ответы [ 3 ]

14 голосов
/ 28 января 2011

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

.Return(new Order());

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

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

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

2 голосов
/ 03 мая 2012

Патрик Стил предложил этот метод расширения:

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;
}

См. Его запись в блоге для более подробной информации.

2 голосов
/ 28 января 2011

Повторите 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());
...