【问题标题】:How do I test "Parameters Passed In Final Call" using RhinoMocks?如何使用 RhinoMocks 测试“最终调用中传递的参数”?
【发布时间】:2010-12-14 18:25:15
【问题描述】:

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

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

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 也会这样做吗?

【问题讨论】:

    标签: rhino-mocks rhino


    【解决方案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 支持你想做的事情。您能否创建一个失败的测试用例来显示您在原始问题中发现的问题(您在其中获得了对最新信息的引用)?

    【讨论】:

    • 嗨帕特里克。是的对不起:在尝试简化代码时,我简化了问题!下面演示了我认为的问题所在。公平地说,我现在可以看到编写代码的更好方法,但我仍然直观地期望 NotWorkingPresenter 可以工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多