Могу (или должен) ли я смоделировать методы на тестируемом объекте, кроме тестируемого метода? - PullRequest
2 голосов
/ 19 ноября 2008

У меня есть такой класс:

public class ClassA
{
    public bool MethodA()
    {
      //do something complicated to test requiring a lot of setup
    }
    public bool MethodB()
    {
         if (MethodA())
             //do something
         else
             //do something else
         endif
    }
}

У меня есть тесты для MethodA и я хочу проверить MethodB, но все, что я хочу сделать, это проверить, что если MethodA возвращает true, что-то происходит, и если MethodA возвращает false, что-то происходит. Могу ли я сделать это с Rhino Mocks? Или мне нужно настроить все те же макеты, которые я уже использовал в тестах для MethodA?

Ответы [ 2 ]

1 голос
/ 19 ноября 2008

Возможно, вам придется извлечь интерфейс из класса или сделать его абстрактным, я уверен, что Rhino.Mocks может имитировать классы и интерфейсы. Это означает, что вы должны быть в состоянии сделать что-то вроде этого:

ClassA myClass = MockRepository.PartialMock(typeof(ClassA));

Expect.Call(myClass.MethodA).Return( true );

MockRepository.ReplayAll()
Assert.AreEqual( false, myClass.MethodB() )
MockRepository.VerifyAll()

Синтаксис может быть немного неправильным, но это должно позволить тестировать MethodB независимо от MethodA

1 голос
/ 19 ноября 2008

Трудно сказать, если это выполнимо без контекста, но одно решение могло бы извлечь MethodA () в его собственный класс, чтобы вы могли иметь MethodB (), вызывающий MethodA () для ложного объекта, который будет действовать как желание модульного тестирования.

Другой возможностью является создание подкласса ClassA в ваших модульных тестах и переопределение MethodA () для возврата true или false в зависимости от вашего модульного теста.

//--- pseudo-code 
public ClassAMethodAReturnTrue : public ClassA { 
  public bool MethodA() { return true; } 

  ...

Затем в ваших тестах вы создаете экземпляр ClassAMethodAReturnTrue вместо ClassA. Вы напишете ClassAMethodAReturnFalse аналогичным образом.

...