Задача начинающего носорога - PullRequest
1 голос
/ 08 января 2009

Итак, я новичок в издевательствах над носорогом и пытаюсь запустить его в шаблонный MVP-проект, в котором я работаю. Итак, у меня есть интерфейс, представляющий мой View и класс для моего Presenter, например:

public interface IView {
  string SomeData { get; set; }
}

public class Presenter {
  public IView View { get; set; }
  public void Init(IView view) {
    this.View = view;
  }

  public virtual string DoStuff(){
    return "Done stuff with " + this.View.SomeData;
  }
}

И я пытаюсь настроить тест на макет метода DoStuff, поэтому у меня есть базовое приспособление, подобное этому:

[TestMethod]
public void Test(){
  var mocks = new MockRepository();
  var view = mocks.Stub<IView>();
  var presenter = mocks.StrictMock<Presenter>();

  presenter.Init(view);

  using(mocks.Record()){
    presenter.Expect(p => p.DoStuff()).Return("Mocked result");
  }

  string result = string.Empty;
  using(mocks.Playback()){
    result = presenter.DoStuff();
  }

  Assert.AreEqual(result, "Mocked result");
}

Но я продолжаю получать исключение null reference из метода DoStuff (во время установки ожидания), поскольку объект View является нулевым. И вот где я застрял. Я вызвал метод Init, который присваивает значение свойству View, и я подумал, что смысл установки ожидания заключается в том, что сам метод никогда не вызывался?

Ответы [ 4 ]

8 голосов
/ 08 января 2009

Похоже, вы тестируете Rhino Mocks. Вы издеваетесь над представителем и представителем. Я собираюсь предположить, что издеваться над докладчиком нежелательно, и вы должны высмеивать только представление.

2 голосов
/ 08 января 2009

Вам также необходимо смоделировать свойство View, вместо вызова метода Init для смоделированного докладчика.

presenter.Expect( p => p.View ).Return( view );

Возможно, вы захотите использовать новый синтаксис AAA (Arrange-Act-Assert) для RhinoMocks.

string expectedResult = "Done stuff with Mocked Result";

var view = MockRepository.GenerateMock<IView>();
view.Expect( v => v.SomeData ).Return( "Mocked Result" );

var presenter = new Presenter();
presenter.Init( view );

string actualResult = presenter.DoStuff();

Assert.AreEqual( expectedResult, actualResult );

view.VerifyAllExpectations();

РЕДАКТИРОВАТЬ Посмотрев на это еще раз, я бы согласился с @ayende, что вам, вероятно, следует только посмеяться над заглушкой, а не докладчиком. Я оставлю исходное исправление, чтобы заставить ваш код работать, но обновлю мой пример, чтобы отразить последний.

0 голосов
/ 08 января 2009

Как уже писали другие, вам нужно решить, какой код вы пытаетесь протестировать, и только издеваться над другими вещами. Если вы пытаетесь протестировать докладчика, то вам нужно только макетировать / заглушить представление, все еще используя настоящий докладчик. Примерно так:

[TestMethod]
public void Test(){
  var view = MockRepository.GenerateStub<IView>();
  var presenter = new Presenter();
  presenter.Init(view);
  view.SomeData = "Test";
  Assert.AreEqual(presenter.DoStuff(), "Done stuff with Test");
}

Затем вы проверяете, что метод Presenter.DoStuff () правильно использует представление.

Надеюсь, это поможет.

0 голосов
/ 08 января 2009

Из того, что я вижу в вашем исходном коде и ваших тестах, трудно понять, что вы на самом деле пытаетесь протестировать. Вид? Ведущий?

Поскольку у вас есть интерфейс для вашего представления и реализация класса для вашего докладчика, я думаю, что вы хотите смоделировать представление и протестировать докладчика.

Вот сайт группы (я разместил ссылку на этот вопрос для вас):

http://groups.google.com/group/RhinoMocks

Смотрите этот код. Это с 2007 года, но он может дать вам суть насмешки.

http://tech.groups.yahoo.com/group/AgileEmbedded/files/HomeGuard/

...