如何使用Rhino Mocks检查传递给方法的值

and*_*ndy 17 c# unit-testing rhino-mocks mocking

我是嘲笑的新手,我很难解决UnitTesting的问题.

说我有这个代码:

public class myClass{

    private IDoStuff _doer;

    public myClass(IDoStuff doer){
        _doer = doer;
    }

    public void Go(SomeClass object){

        //do some crazy stuff to the object

        _doer.DoStuff(object) //this method is  void too
    }
}
Run Code Online (Sandbox Code Playgroud)

好的,所以我想UNIT测试Go方法.一旦得到它,我不关心_doer对象对对象的作用.

但是,我确实想检查_doer对象收到了什么.

在PSEUDO代码我想实现这个:

[Test]
public void MyTest()
{
    IDoStuff doer = Mocker.Mock<IDoStuff>();
    Guid id = Guid.NewGuid();

    //test Go method
    new MyClass(doer).Go(new SomeClass(){id = id});

    Assert.AreEqual(id,MockingFramework.Method(DoStuff).GetReceived<SomeClass>().id);
}
Run Code Online (Sandbox Code Playgroud)

这是否可以使用Rhino,如果是这样,我该如何实现它?

干杯

Wim*_*nen 24

使用新的Arrange/Act/Assert语法:

[Test]
public void MyTest()
{
    // arrange
    IDoStuff doer = MockRepository.GenerateStub<IDoStuff>();
    MyClass myClass = new Myclass(doer);
    Guid id = Guid.NewGuid();

    // act
    myClass.Go(new SomeClass(){id = id});

    // assert
    doer.AssertWasCalled(x => x.DoStuff(
        Arg<Someclass>.Matches(y => y.id == id)));
}
Run Code Online (Sandbox Code Playgroud)


Pat*_*ele 7

所有这些答案提供了各种方法来做你想要的,所有这些都有效.还有一件事需要注意.如果你需要真正"低级别"并检查传递给任何存根/模拟方法的参数,你可以使用GetArgumentsForCallsMadeOn.

它返回object [] []时有点乱.你这样使用它(假设你存根stubber.InsertData接受null):

var args = stubber.GetArgumentsForCallsMadeOn(s => s.InsertData(null));
Run Code Online (Sandbox Code Playgroud)

args [0]是第一次调用时传递给InsertData的参数数组.

args [1]是第二次调用时传递给InsertData的参数数组.

等等...

因此,如果您希望看到作为第一次调用某个方法的第二个参数传递的整数值,您可以:

var check = (int) args[0][1];
Run Code Online (Sandbox Code Playgroud)

同样,我建议使用以前的方法之一,但是如果您需要真正关闭并查看参数,这是可用的.


Wys*_*wyg 5

我认为您所拥有的很好,那就是:

IDoStuff doer = MockRepository.GenerateMock<IDoStuff>();
Run Code Online (Sandbox Code Playgroud)

然后通过以下方式设置期望值:

doer.Expect(() => DoStuff(id));
Run Code Online (Sandbox Code Playgroud)

然后最后:

doer.VerifyAllExpectations();
Run Code Online (Sandbox Code Playgroud)

根据Lee的回答进行编辑,注意您还可以执行以下操作:

doer.Expect(d => d.DoStuff(Arg<int>.Is.GreaterThan(5))
Run Code Online (Sandbox Code Playgroud)

要么

doer.Expect(d => d.DoStuff(Arg<CustomObject>.Matches(x => x.CustomProperty == "Beef")));
Run Code Online (Sandbox Code Playgroud)

或不想使用Arg和Arg对象进行精确参考比较的类似测试。