помощ при написването на единичен тест за метод с rhino mocks

Имам нужда от помощ при написването на модулен тест за следния клас с помощта на 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) метод) . Методът notify не е внедрен в тествания клас, а в базовия клас, който е наследен от класа, който тествам. Някакви идеи какъв може да е проблемът? - 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