Как мне проверить «Параметры, переданные при окончательном вызове», используя RhinoMocks? - PullRequest
1 голос
/ 14 декабря 2010

Как лучше всего использовать Rhino Mocks для проверки того, что определенный параметр передается при вызове метода FINAL? Например, mockview.SetSomething (myObj) может вызываться любое количество раз mockview.Init, но я хочу проверить, что в последний раз он вызывается как mockview.SetSomething (inParticular).

Теперь я знаю, что могу использовать GetArgumentsForCallsMadeOn с этим, но моя проблема в том, что он не работает, если я впоследствии изменил переменную, содержащую параметр. * например 1003 *

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 Ответ

1 голос
/ 14 декабря 2010

В вашем коде должно быть что-то еще (кроме насмешек). Я просто собрал несколько предметов:

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];
}

И я получил значения 2 и «Два» внутри ViewData. Похоже, Rhino.Mocks поддерживает то, что вы хотите сделать. Не могли бы вы создать неудачный тестовый пример, в котором показана проблема, указанная в исходном вопросе (где вы получили ссылку на самую свежую информацию)?

...