如何使用RhinoMocks测试“最终调用中传递的参数”?

时间:2010-12-14 18:25:16

标签: rhino-mocks rhino

Rhino Mocks测试特定参数在FINAL调用方法上传递的最佳方法是什么?例如mockview.SetSomething(myObj)可能会被mockview.Init多次调用,但我想测试它最后一次被称为mockview.SetSomething(inParticular)。

现在我知道我可以使用GetArgumentsForCallsMadeOn,但我的问题是,如果我随后更改了参数保持变量,它就不起作用了。 e.g

public interface IView
{
    void SetSomething(ViewData data);
}

public class ViewData
{
    public int Age { get; set; }
    public string Name { get; set; }

    public ViewData Person(int age, string name)
    {
        Age = age;
        Name = name;
        return (this);
    }
}

public class WorkingPresenter
{
    public void Init(IView view)
    {
        var data = new ViewData {Age = 1, Name = "One"};
        view.SetSomething(data);
        data = new ViewData {Age = 2, Name = "Two"};
        view.SetSomething(data);
        data = new ViewData {Age = 3, Name = "Three"};
    }
}

public class NotWorkingPresenter
{
    private ViewData _data;

    public void Init(IView view)
    {
        _data = new ViewData();
        view.SetSomething(_data.Person(1, "One"));
        view.SetSomething(_data.Person(2, "Two"));
        _data.Person(3, "Three");

    }
}

然后我的测试是......

    [Test]
    public void GetDataOfLastCall()
    {
        ViewData dummydata=null;
        var view = MockRepository.GenerateStub<IView>();

        //Approach 1 : This works 
        var workingPresenter = new WorkingPresenter();
        workingPresenter.Init(view);
        var lastCall = view.GetArgumentsForCallsMadeOn(v => v.SetSomething(dummydata)).Count - 1;
        var lastParams = view.GetArgumentsForCallsMadeOn(v => v.SetSomething(dummydata))[lastCall];
        var lastData = (ViewData)lastParams[0];

        //Approach 2: This doesn't
        var notWorkingPresenter = new NotWorkingPresenter();
        notWorkingPresenter.Init(view);
        lastCall = view.GetArgumentsForCallsMadeOn(v => v.SetSomething(dummydata)).Count - 1;
        lastParams = view.GetArgumentsForCallsMadeOn(v => v.SetSomething(dummydata))[lastCall];
        lastData = (ViewData)lastParams[0];

我想要的是验证对SetSomething的最后一次调用是{name =“Two”,age = 2}。现在workingPresenter会这样做,但你不期望notWorkingPresenter也这样做吗?

1 个答案:

答案 0 :(得分:1)

你的代码中必须有其他东西(在模拟之外)。我只是把几个项目拼凑在一起:

public interface IView
{
    void SetSomething(ViewData data);
}

public class ViewData
{
    public int Age { get; set; }
    public string Name { get; set; }
}

我测试了它:

[TestMethod]
public void GetDataOfLastCall()
{
    var view = MockRepository.GenerateStub<IView>();

    var data = new ViewData {Age = 1, Name = "One"};
    view.SetSomething(data);
    data = new ViewData { Age = 2, Name = "Two" };
    view.SetSomething(data);
    data = new ViewData { Age = 3, Name = "Three" };

    var lastCall = view.GetArgumentsForCallsMadeOn(v => v.SetSomething(data)).Count - 1;
    var lastParams = view.GetArgumentsForCallsMadeOn(v => v.SetSomething(data))[lastCall];
    var lastData = (ViewData) lastParams[0];
}

我在ViewData中得到了2和“Two”的值。看起来Rhino.Mocks支持您想要做的事情。您是否可以创建一个失败的测试用例,其中显示原始问题中确定的问题(您可以参考最新信息)?