помощ при тестване на абстрактен метод с Rhino mocks

Търся да напиша някои модулни тестове за моя c# клас. Имам базов клас, наречен BaseClass, който има абстрактен метод, наречен Execute, а също и метод, наречен Redirect. Имам клас, наречен Class1, който наследява BaseClass и имплементира абстрахирания метод Execute, методът, който искам да тествам. Следният код обяснява допълнително настройката:

public abstract class BaseClass
{
    public abstract void Execute();

    public void Redirect()
    {
        // redirect code here
    }
}

public class Class1 : BaseClass
{
    public void Execute()
    {
      // do some processing

      this.Redirect();
    }
}

Работя с mstest и използвам rhino mocks за моите подигравки. Искам да напиша тестове за метода Execute, за да тествам дали работи както очаквам.

Както можете да видите отгоре, методът Execute прави извикване към основния метод Redirect, така че очаквам, че методът Redirect ще бъде извикан.

Използвам Rhino mocks mockrepository, за да създам частичен макет на Class1. Създаденият макет съдържа метода Execute, който е страхотен, но не съдържа препратка към метода Redirect, който е в Class1. Искам да мога да задам очакване на макетното хранилище, че методът Redirect се извиква.

Някакви съвети или съвети как бих могъл да създам тест с имитации на носорог, за да постигна това, което съм очертал?


person amateur    schedule 10.12.2011    source източник


Отговори (2)


Ако трябва да се подиграете с този метод, вероятно поведението е достатъчно сложно, за да не можете да го тествате директно.

Поради тази причина, моля, помислете за делегиране на това поведение на клас, който си сътрудничи, след което напълно да се подиграете с този клас.

Например, ако методът за изпълнение записваше обект в база данни, щях да създам хранилище, да инжектирам зависимостта в това хранилище чрез конструктора, след което да поискам от хранилището да запази моя обект. След това целият сътрудничещ клас може да бъде макиран с помощта на стандартни техники.

В момента изглежда, че вашият клас е отговорен за твърде много, поради което имате проблеми. Mocks работят много ефективно, когато се използват за изразяване на сътрудничество, което ни позволява да създаваме класове с единични отговорности, което ни позволява да създаваме добре проектиран, поддържаем код. Препоръчвам книгата на Стив Фрийман и Нат Прайс по темата.

person Lunivore    schedule 11.12.2011

Ще трябва да декларирате метода на базовия клас Redirect() като virtual, така че Rhino Mocks да може да му се подиграе. Следното работи за мен:

public abstract class BaseClass
{
    public abstract void Execute();

    public virtual void Redirect()
    {
        // redirect code here
    }
}

public class Class1 : BaseClass
{
    public override void Execute()
    {
        // do some processing

        this.Redirect();
    }
}

..
var class1Mock = Rhino.Mocks.MockRepository.GeneratePartialMock<Class1>();

class1Mock.Expect(x => x.Redirect());
class1Mock.Execute();
class1Mock.VerifyAllExpectations();
person BrokenGlass    schedule 10.12.2011
comment
Благодаря много за това, много полезно. Дали методът за пренасочване е защитен в BaseClass, възможно ли е все пак да му се подигравате, като добавите виртуален към него? Или това работи само за публични методи. - person amateur; 12.12.2011