使用rhino mocks为每个调用返回不同的实例

时间:2011-01-28 13:30:34

标签: c# .net unit-testing mocking rhino-mocks

我有这段代码:

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

每次调用此类实例四次时,每次返回相同的实例。我希望返回差异实例。我希望能够做到这样的事情:

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

这可以通过某种方式完成吗?

3 个答案:

答案 0 :(得分:14)

而不是使用

.Return(new Order());

尝试使用

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

这将每次调用委托,创建一个新对象。

答案 1 :(得分: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());

答案 2 :(得分:2)

Patrick Steele建议使用此扩展方法:

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

See his blog entry了解详情。