Rhino Mocks Stub 不调用 .WhenCalled 动作

Rhino Mocks Stub not calling .WhenCalled action

我正在使用 NUnit 和 Rhino Mocks 编写单元测试以生成存根。我想使用 .WhenCalled 方法来控制存根方法的 return 值。当我将 lambda 语句传递给方法时,它按预期工作,但当我传递方法委托时却没有。

例如,假设我有以下界面:

public interface INumberCollection
{
  int[] GetNumbers();
}

对于我的测试 class 我有以下内容:

[TestFixture]
public class MyTests
{
  private INumberCollection _collection;
  private Action<MethodInvocation> _action;

  [OneTimeSetUp]
  public void MyTests_OneTimeSetup()
  {
    _collection = MockRepository.GenerateStub<INumberCollection>();
    _collection.Stub(c => c.GetNumbers())
      .Repeat.Any()
      .Return(new[] {0, 0, 0})
      .WhenCalled(x => { x.ReturnValue = new[] {1, 2, 3}; });
  }

  [Test]
  public void MyTest()
  {
    var result = _collection.GetNumbers();

    Assert.That(result, Is.EqualTo(new[] {1, 2, 3}));
  }
}

测试通过。但是,当我用以下方法替换设置方法时测试失败:

[OneTimeSetUp]
public void MyTests_OneTimeSetup()
{
  _collection = MockRepository.GenerateStub<INumberCollection>();
  _collection.Stub(c => c.GetNumbers())
    .Repeat.Any()
    .Return(new[] {0, 0, 0})
    .WhenCalled(_action);

  _action = x => { x.ReturnValue = new[] { 1, 2, 3 }; };
}

我希望 .WhenCalled 调用存储在 _action 和 return {1, 2, 3} 中的委托,但实际上是 returning {0, 0, 0},好像 .WhenCalled 被完全跳过了。我什至在 lambda 中插入了一个断点,并验证了它在调试测试时从未被击中。

为什么 _action 从来没有接到电话?

_action 没有被调用,因为它在传递给 .WhenCalled.

时是 null

因为 _action 作为参数传递给 .WhenCalled,所以在传递后更改它的值没有任何效果。要解决此问题,请在 before 将其传递给 .WhenCalled:

[OneTimeSetUp]
public void MyTests_OneTimeSetup()
{
  _action = x => { x.ReturnValue = new[] { 1, 2, 3 }; };

  _collection = MockRepository.GenerateStub<INumberCollection>();
  _collection.Stub(c => c.GetNumbers())
    .Repeat.Any()
    .Return(new[] {0, 0, 0})
    .WhenCalled(_action);
}