C# 在单个方法调用中更改对rhino Mock的期望
我有一个Dispatcher,我在该计时器的计时器刻度中检查组件的忙/闲状态。我必须等到组件空闲时,类似IsBusy()的方法返回false,然后我必须自动启动一些东西。我想通过首先模拟组件繁忙,然后在一段时间后使其空闲,并查看自动功能启动来测试场景。当然,一旦我调用了测试中的代码,我就会输入一个wait。是否可以从测试中设置新的期望,并向生产代码发送更新,以便我能够完成我需要做的事情?我使用Nunit进行单元测试。您的期望可以动态创建,但它们应该在一个地方设置,而不是“交互地”。在测试代码时,不应尝试更改它们。 为了实现您的目标,您可以尝试使用C# 在单个方法调用中更改对rhino Mock的期望,c#,.net,rhino-mocks,C#,.net,Rhino Mocks,我有一个Dispatcher,我在该计时器的计时器刻度中检查组件的忙/闲状态。我必须等到组件空闲时,类似IsBusy()的方法返回false,然后我必须自动启动一些东西。我想通过首先模拟组件繁忙,然后在一段时间后使其空闲,并查看自动功能启动来测试场景。当然,一旦我调用了测试中的代码,我就会输入一个wait。是否可以从测试中设置新的期望,并向生产代码发送更新,以便我能够完成我需要做的事情?我使用Nunit进行单元测试。您的期望可以动态创建,但它们应该在一个地方设置,而不是“交互地”。在测试代码时,
Repeat
选项允许检查循环一定次数:
mock.Expect(theMock => theMock.IsBusy())
.Return(true)
.Repeat.Times(5);
mock.Expect(theMock => theMock.IsBusy())
.Return(false);
您可以使用Rhino Mocks在被模拟组件的
IsBusy()
方法中模拟预先指定的等待时间:
[TestFixture]
public class TestClass
{
[Test]
public void MyTest()
{
var mocks = new MockRepository();
var mockComponent = mocks.DynamicMock<MyComponent>();
using (mocks.Record ())
{
Expect.Call(() => mockComponent.IsBusy())
.Do((Func<bool>)(() =>
{
System.Threading.Thread.Sleep(10000); // wait 10 seconds
return false;
}));
// perhaps define other expectations or asserts here...
}
using (mocks.Playback())
{
var classUnderTest = new ClassUnderTest(mockComponent);
classUnderTest.MethodUnderTest();
}
mocks.VerifyAll();
}
}
我没有机会经常使用Rhino.mock,所以如果我错了,请纠正我:)希望这个例子仍然适用,tho。
public class ClassUnderTest
{
private MyComponent myComponent;
public ClassUnderTest(MyComponent myComponent)
{
this.myComponent = myComponent;
}
public void MethodUnderTest()
{
dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
dispatcherTimer.Interval = new TimeSpan(0,0,1);
dispatcherTimer.Start();
// ...
}
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
if(!myComponent.IsBusy())
{
// do something else now...
}
}
}
public class MyComponent
{
public virtual bool IsBusy()
{
// some implementation that will be faked via the Do Handler
return false;
}
}