помощь в написании модульного теста для метода с использованием моков Rhino

Мне нужна помощь в написании модульного теста для следующего класса с использованием Rhino Mocks 3.5. Следующий переопределенный метод в моем классе:

    public override void Initialize(params object[] messages)
    {
        var data = new ViewData
        {
            Name = this.GetName()
        };

        this.Notify(data);
    }

Я хочу написать тест для проверки того, что при вызове метода Initialize метод вызывает метод Notify и имеет параметр типа ViewData. Также я хочу проверить, что в этом методе вызывается метод GetName, который является частным. Я использую аксессор для доступа к закрытому методу GetName.

Любая помощь будет замечательной, так как я новичок в написании тестов и нуждаюсь в помощи.


person amateur    schedule 25.11.2011    source источник
comment
Какой метод Notify() делает? Имеет ли он доступ к каким-либо другим классам, внедренным в this класс?   -  person sll    schedule 26.11.2011
comment
Какие подписи у GetName () и Notify ()? Если Notify принимает только ViewData, вам не нужно писать модульный тест, чтобы убедиться, что параметр имеет тип ViewData - .NET выполнит это для вас во время компиляции.   -  person PatrickSteele    schedule 26.11.2011


Ответы (2)


То, что вам нужно, называется частичным макетом.

[Test]
public void UsingPartialMocks()
{
  MockRepository mocks = new MockRepository();
  YourClass partialMock =  mocks.PartialMock<YourClass>();
  Expect.Call(partialMock.Notify(null)).IgnoreArguments();
  mocks.ReplayAll();
  partialMock.Initialize(null);
  mocks.VerifyAll();
}
person Jon Freedman    schedule 26.11.2011
comment
Спасибо за вашу помощь, Джон, но когда я пытаюсь выполнить описанное выше, я получаю сообщение об ошибке: Недействительный вызов, последний вызов был использован или не было выполнено ни одного вызова (убедитесь, что вы вызываете виртуальный (C #) / Overridable (VB) метод) . Метод уведомления реализован не в тестируемом классе, а в базовом классе, который наследуется классом, который я тестирую. Есть идеи, в чем может быть проблема? - person amateur; 28.11.2011
comment
Вы можете попробовать использовать лямбда-синтаксис - см. stackoverflow.com/questions/1301116/ - person Jon Freedman; 28.11.2011
comment
Я изменил строку выше на Expect.Call (() = ›partialMock.Notify (null)). IgnoreArguments (); но по-прежнему возникает та же ошибка - есть идеи? - person amateur; 28.11.2011
comment
В сообщении об ошибке говорится, что происходит не так: (убедитесь, что вы вызываете виртуальный (C #) / Overridable (VB) метод). Похоже, вы пытаетесь имитировать метод, который не является виртуальным, что невозможно с Rhino Mocks. - person matt; 28.11.2011
comment
@ mdj79 - это была моя проблема, спасибо за помощь с этим - person amateur; 29.11.2011

Я не отвечу прямо на ваш вопрос о том, как это сделать с помощью Rhino (похоже, Джон уже проделал приличную работу в этом направлении), но ради потомства я покажу, как я бы протестировал это с помощью ручного издевательства. (терпите меня, прошло много времени с тех пор, как я написал C #, так что извините за синтаксические ошибки)

[Test]
public void initializeRegistersViewDataWithGivenName()
{
  ShuntedYourClass yourClass = new ShuntedYourClass();
  yourClass.initialize( /* arg list */ );

  // Verify 'Notify' was called
  Assert.NotNull(yourClass.registeredViewData);

  // Verify 'GetName' private method was invoked and
  // 'Name' was properly populated
  Assert.AreEqual("expected name", yourClass.registeredViewData.Name);
}

// Nested class for testing purposes only.
class ShuntedYourClass : public YourClass
{
  public ViewData registeredViewData;

  public override void Notify(ViewData vd)
  {
    this.registeredViewData = vd;
  }
}

Этот код теперь проверяет, что метод Initialize действительно работает правильно, и выполняет Notify с правильными параметрами.

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

Брэндон

person bcarlso    schedule 28.11.2011