RhinoMocks - 测试引用类型的属性值

时间:2012-12-17 17:34:27

标签: c# unit-testing rhino-mocks

我需要测试执行函数的逻辑,之后它会更改参数的属性,然后使用更新的参数执行相同的函数。

为了帮助说明这一点,下面是一些示例代码:

接口:    public interface IWorker {    MyObjectB DoWork(MyObject myObject); }

MyObjectB:    public class MyObjectB {    public string Message { get; set; } }

实现:

public MyObjectB DoWork(IWorker worker, MyObject myObject)
{
    worker.DoWork(myObject);
    myObject.Name = "PersonB";
    worker.DoWork(myObject);
    return new MyObjectB() { Message = "Done" };
}

测试:

    public void RhinoMocksSampleTest()
    {
     var workerStub = MockRepository.GenerateStub<IWorker>();
     workerStub.Stub(n => n.DoWork(Arg<MyObject>.Is.Anything));

     var myObj = new MyObject { Id = 1, Name = "PersonA" };

     var p = new Program();
     p.DoWork(workerStub, myObj);

     workerStub.AssertWasCalled(d => d.DoWork(Arg<MyObject>.Matches(r => r.Name == "PersonA")));

     workerStub.AssertWasCalled(d => d.DoWork(Arg<MyObject>.Matches(r => r.Name == "PersonB")));
    }

第一个AssertWasCalled失败,因为值为'PersonB'。 是否有一个函数/调用我可以用来测试第一次调用的对象状态?

2 个答案:

答案 0 :(得分:1)

以下是我将如何做你想做的事情:

public void RhinoMocksSampleTest()
{
    var workerMock = MockRepository.GenerateMock<IWorker>();
    workerMock.Expect(d => d.DoWork(Arg<MyObject>.Matches(r => r.Name == "PersonA")));
    workerMock.Expect(d => d.DoWork(Arg<MyObject>.Matches(r => r.Name == "PersonB")));

    var myObj = new MyObject { Id = 1, Name = "PersonA" };
    var p = new Program();
    p.DoWork(workerMock , myObj);

    workerMock.VerifyAllExpectations();
}

答案 1 :(得分:0)

除了很好的回答aprescott提供的内容之外,我还可以展示另一种在某些情况下有用的方法:

我们的想法是将您感兴趣的值手动存储到某个集合中。然后,您将能够断言该集合包含所需的顺序。

    public void MyTest()
    {
        // that is list which will contain passed names
        var actualNames = new List<string>();

        // stub only saves passed Name property into list
        var workerStub = MockRepository.GenerateStub<IWorker>();
        workerStub
            .Stub(w => w.DoWork(Arg<MyObject>.Is.Anything))
            .Do((Action<MyObject>)(mo => actualNames.Add(mo.Name)));

        var myObject = new MyObject { Name = "PersonA" };
        var target = new MyWorker();

        target.DoWork(workerStub, myObject);

        // here we do assert that names list contains what is required
        Assert.That(actualNames, Is.EqualTo(new[] { "PersonA", "PersonB" }));
    }

PS。是的,它适用于需要检查调用顺序是否正确的情况:)