Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在单个方法调用中更改对rhino Mock的期望_C#_.net_Rhino Mocks - Fatal编程技术网

C# 在单个方法调用中更改对rhino Mock的期望

C# 在单个方法调用中更改对rhino Mock的期望,c#,.net,rhino-mocks,C#,.net,Rhino Mocks,我有一个Dispatcher,我在该计时器的计时器刻度中检查组件的忙/闲状态。我必须等到组件空闲时,类似IsBusy()的方法返回false,然后我必须自动启动一些东西。我想通过首先模拟组件繁忙,然后在一段时间后使其空闲,并查看自动功能启动来测试场景。当然,一旦我调用了测试中的代码,我就会输入一个wait。是否可以从测试中设置新的期望,并向生产代码发送更新,以便我能够完成我需要做的事情?我使用Nunit进行单元测试。您的期望可以动态创建,但它们应该在一个地方设置,而不是“交互地”。在测试代码时,

我有一个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;
    }
}