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);
}
我正在使用 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);
}