2013-06-27 3 views
2

У меня есть метод, который мне нужно проверить, и внутри метода есть вызов того же метода базового класса. Чтобы написать модульный тест, нужно ли издеваться над этим методом base.ResolveDate (compareSeries, targetDate)? Как мне это сделать? Я не думаю, что извлечение интерфейса здесь будет работать!Как отключить/выкрой вызов базового класса внутри моего метода

public override DateTime ResolveDate(ISeries comparisonSeries, DateTime targetDate) 
{ 
    if (comparisonSeries == null) 
    { 
     throw new ArgumentNullException("comparisonSeries"); 
    } 

    switch (comparisonSeries.Key) 
    { 
     case SeriesKey.R1: 
     case SeriesKey.R2: 
     case SeriesKey.R3: 
     case SeriesKey.R4: 
     case SeriesKey.R5: 
      return DateHelper.PreviousOrCurrentQuarterEnd(targetDate); 
    } 

    return base.ResolveDate(comparisonSeries, targetDate); 
} 
+0

Почему вы хотите сделать это? Почему не единичный тест вместе с базовым классом? По мне, даже если вы проверите его с базовым классом, он все равно будет единичным тестом. –

+1

Я думаю, для этого вам придется использовать TypeMock или Microsoft Fakes. Другой вариант - использовать композицию вместо наследования (с общим интерфейсом), а затем «base.ResolveDate» вместо этого будет зависимостью в классе, который вы пытаетесь протестировать. – Matthew

+0

Что касается модульного тестирования, должен ли я перейти в мою базу.ResolveDate() для выполнения модульного теста на дочернем классе ResolveDate()? Разве я не хочу просто проверить, что внутри дочернего класса ResolveDate(), не переходя в какие-либо другие классы? – user1186050

ответ

0

Я не уверен, что вы поступаете правильно, желая заглушить или обнулить базовый вызов. Однако у меня есть решение проблемы. Мое решение основано на предположении, что ваш класс не запечатан и он общедоступен.

Решение заключается в перемещении base.ResolveDate() в новый защищенный виртуальный метод. Делая это, вы легко сможете удалить вызов base.ResolveDate(). В вашем тестовом коде вы должны получить новый класс из своего класса для модульного тестирования, а затем переопределить вновь добавленный защищенный виртуальный метод на no-op.

После рефакторинга вашего производства кода, это то, как он должен выглядеть:

public class MyClass : SomeBaseClass 
{ 
    public override DateTime ResolveDate(object someinput) 
    { 
     if (ConditionMet(someinput)) 
      return ResolveDateMyLogic(someinput); 

     return ResolveDateUsingBaseLogic(someinput); 
    } 

    private bool ConditionMet(object someInput) 
    { 
     return true; 
    } 

    private DateTime ResolveDateMyLogic(object someinput) 
    { 
     return DateTime.Now; 
    } 

    protected virtual DateTime ResolveDateUsingBaseLogic(object someinput) 
    { 
     return base.ResolveDate(someinput); 
    } 
} 

Надежда, он решает вашу проблему.

+0

С точки зрения того, что нужно протестировать для тестирования звукового модуля RsolveDate(), не будет ли это просто логикой внутри дочернего класса ResolveDate()? Таким образом, никакие другие методы из других классов не должны вводиться (если они не являются частью одного и того же класса)? Таким образом, чтобы выполнить правильный модульный тест, я бы заглушил/вычеркнул DateHelper.PreviousOrCurrentQuarterEnd() и base.ResolveDate() и просто проверил логику внутри ResolveDate() ??? – user1186050

0

С RhinoMocks вы можете сделать это (не забудьте включить Rhino.Mocks, а также Rhino.Mocks.Interfaces):

var dateResolver = MockRepository.GenerateStub<BaseDateResolver>(); 

dateResolver.Stub(x => x.ResolveDate(comparisonSeries, targetDate)) 
    .CallOriginalMethod(OriginalCallOptions.NoExpectation); 

 Смежные вопросы

  • Нет связанных вопросов^_^