C# 如何正确使用Rhino.Mocks AssertWasCalled()?

C# 如何正确使用Rhino.Mocks AssertWasCalled()?,c#,nunit,rhino-mocks,assert,C#,Nunit,Rhino Mocks,Assert,我调用\u mocks.ReplayAll(),然后调用一个或多个\u mockedObject.AssertWasCall(),然后调用\u mocks.VerifyAll()。但它告诉我“当模拟对象处于记录状态时,此操作无效” 调用这些方法的正确顺序是什么?似乎我找到了解决方案。这看起来有点奇怪,但它确实有效。由于某种原因,我需要调用ReplayAll()两次 这项工作: [Test] public void SetStateExecuting_Should_Set_State_To_Pa

我调用
\u mocks.ReplayAll()
,然后调用一个或多个
\u mockedObject.AssertWasCall()
,然后调用
\u mocks.VerifyAll()
。但它告诉我“当模拟对象处于记录状态时,此操作无效”



调用这些方法的正确顺序是什么?

似乎我找到了解决方案。这看起来有点奇怪,但它确实有效。由于某种原因,我需要调用ReplayAll()两次

这项工作:

[Test]
public void SetStateExecuting_Should_Set_State_To_Pause_And_Not_Change_GlobalState_When_GlobalState_Is_Paused()
{
    var task = new Task { ID = 1, TimeZone = -660, GlobalState = TaskState.Paused };
    _mockRepository.ReplayAll();
    _manager.SetStateExecuting(task);
    _taskDataProvider.AssertWasCalled(p => p.StateUpdate(task.ID, task.TimeZone, TaskState.Paused));
    _taskDataProvider.AssertWasNotCalled(p => p.GlobalStateUpdate(task.ID, TaskState.Executing));
    _mockRepository.ReplayAll();
}

您正在混合旧的录制/重播模式和新的模式

在记录模式下设置“不使用这些参数调用”期望的正常方法如下所示:

_taskDataProvider.Expect(
    p => p.GlobalStateUpdate(task.ID, TaskState.Executing)).Repeat.Never();
或者,您可以使用一个严格的mock,它不允许意外调用

AssertWasCall
AssertWasNotCall
用于AAA,您可以将断言放在末尾。使用Record/Replay语法,在切换到Replay模式之前,应该在开始时设置行为和体验

AssertWasNotCalled
实际上也可以用于录制/重播,但我从未尝试过,因为我不喜欢混合这两种方法的元素。这不必要地使事情复杂化。)

Jon Kruger的博客文章提供了使用rhino mocks方法可以做的一切的简单示例。他还展示了你不能做的事情,这对我的学习很有帮助

如前所述,在静态构造函数中使用Arrange、Act、Assert语法更容易阅读。博客文章展示了这两种方法的示例

以下是Jon示例代码中的示例:

新语法:

 [Test]
    public void You_can_check_to_see_if_a_method_was_called()
    {
        var stub = MockRepository.GenerateStub<ISampleClass>();

        stub.MethodThatReturnsInteger("foo");

        stub.AssertWasCalled(s => s.MethodThatReturnsInteger("foo"));
        stub.AssertWasCalled(s => s.MethodThatReturnsInteger(Arg<string>.Is.Anything));
    }
[测试]
public void您可以检查以查看方法是否被调用()
{
var stub=MockRepository.GenerateStub();
存根。返回到日志(“foo”)的方法;
调用stub.assertwas(s=>s.methodthattreturnsinteger(“foo”);
调用stub.assertwas(s=>s.methodthattreturnsinteger(Arg.Is.Anything));
}
旧式:

    [Test]
    public void Calling_virtual_methods_will_call_the_actual_method()
    {
        var mockRepository = new MockRepository();
        var sampleClass = mockRepository.PartialMock<SampleClass>();
        sampleClass.Replay();

        sampleClass.VirtualMethod("foo").ShouldEqual(3);
        sampleClass.VirtualMethodWasCalled.ShouldBeTrue();
        sampleClass.AssertWasCalled(c => c.VirtualMethod("foo"));
    }
[测试]
public void调用\虚拟\方法\将\调用\实际\方法()
{
var mockRepository=new mockRepository();
var sampleClass=mockRepository.PartialMock();
sampleClass.Replay();
样本类别。虚拟方法(“foo”)。应达到(3);
sampleClass.VirtualMethodAscalled.ShouldBeTrue();
调用sampleClass.assertwas(c=>c.VirtualMethod(“foo”);
}

Hi here,可能有助于展示您是如何声明_manager等的。我通常不需要将其变得如此复杂。另外,查看您正在测试的代码可能会很有用。如果你想得到Rhino Mocks的帮助,我必须说我得到了同事们的帮助,也得到了《单元测试的艺术》一书的帮助
    [Test]
    public void Calling_virtual_methods_will_call_the_actual_method()
    {
        var mockRepository = new MockRepository();
        var sampleClass = mockRepository.PartialMock<SampleClass>();
        sampleClass.Replay();

        sampleClass.VirtualMethod("foo").ShouldEqual(3);
        sampleClass.VirtualMethodWasCalled.ShouldBeTrue();
        sampleClass.AssertWasCalled(c => c.VirtualMethod("foo"));
    }