Как я могу утверждать, что метод вызывается без выполнения кода внутри метода?

Представьте, что у нас есть код ниже

public class test
  {
   public void Condition(x,y)
   {
       if (x == y)
       {
           methodOne();
       }
       else
       {
           methodTwo();
       }
   }
    public void methodOne(){//do some database stuff}
    public void methodTwo(){//do some database stuff}
 }

Я хочу утверждать, что если methodone вызывается, когда x==y или нет, но я не хочу, чтобы мой тест выполнял код внутри моего метода 1, поскольку он будет выполнять некоторые операции с базой данных...

Я пишу что-то вроде этого

 MockRepository mockRepository=new MockRepository();
 var Mock = mockRepository.PartialMock<test>();
 mock.Replay();
 mock.condition(1,1);
 mock.AssertWasCalled(x=>x.methodOne);
 mock.VerifyAllExpectations();

но он пытается запустить запустить материал в методе 1, и я не хочу, чтобы мой тест выполнял соединение с базой данных, мне просто нужно убедиться, что мое условие работает, и оно вызвано или нет.

1 ответ

Решение

Вы смешиваете свои проблемы, бизнес-логику и доступ к данным в одном классе. Вам нужно подумать о принципе единой ответственности и разделении интересов.

Ваш public void Condition(x,y) должно быть на уровне бизнес-логики с methodOne() а также methodTwo() находясь на уровне доступа к данным.

Уровень доступа к данным должен быть введен ( IoC) в уровень бизнес-логики, чтобы его можно было отключить. Таким образом, когда вы тестируете метод Condition, вы переходите в фиктивный уровень доступа к данным, который фактически не подключается к базе данных.

Таким образом, вы можете проверить, что Условие было вызвано, как и сейчас, без каких-либо побочных эффектов, таких как запись в базу данных. Когда вы сталкиваетесь с подобными ситуациями, это помогает вам превратить ваш код в лучшую архитектуру и в конечном итоге может привести вас к исследованию разработки через тестирование.

Другие вопросы по тегам