【问题标题】:Return different instances for each call using rhino mocks使用 rhino 模拟为每个调用返回不同的实例
【发布时间】:2011-06-17 06:11:44
【问题描述】:

我有这个代码:

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

当它被调用四次时,每次都返回相同的实例。我希望返回差异实例。我希望能够做类似的事情:

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

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

【问题讨论】:

  • 你排除了期望的记录吗?
  • 我希望 .Return(Func<T>) 存在。
  • 磨刀师,你是什么意思?我使用 _mocker.ReplayAll();和 _mocker.VerifyAll();...

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


【解决方案1】:

而不是使用

.Return(new Order());

尝试使用

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

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

【讨论】:

  • 需要注意的一点是,即使您不打算传递函数签名,它也必须与原始调用匹配。我的最终看起来像这样:.Stub(m =&gt; m.Load(docId)).Do((Func&lt;long, doc&gt;)(arg =&gt; GetDocument())); 注意多头是如何被丢弃的。否则你会得到一个异常。
【解决方案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】:

    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了解更多详情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多