Метод и макет с тем же классом - PullRequest
5 голосов
/ 05 июня 2011

У меня есть класс с 2 методами

class A
{
  void Fun()
  {
    if(FunRet()>0){///} else {///}
  } 
  int FunRet()
  { return 4;}
};

Я хочу проверить метод Fun () в зависимости от того, что возвращает FunRet. Так что я хочу издеваться над FunRet. Я скорее не хочу делать FunRet виртуальным. Как я могу это сделать?

Ответы [ 5 ]

3 голосов
/ 08 июня 2011

Вы можете внедрить внутриклассовые зависимости.В этом случае заставьте Fun принимать значение вместо его вычисления:

class A
{
  void Fun(int x)
  {
    if(x>0){///} else {///}
  } 
  int FunRet()
  { return 4;}
};

Тогда ваши тесты могут передавать произвольные значения в Fun ().Если вам необходимо обеспечить правильное использование, напишите в своем API общедоступную версию и частную версию для тестирования:

class A {
 public:
  void Fun() { return Fun(FunRet()); }
 private:
  void Fun(int x);  // for testing.
};
1 голос
/ 14 июня 2011

Вы можете извлечь метод Fun в класс калькулятора, который реализует интерфейс.Вы должны передать экземпляр этого интерфейса классу А. в конструкторе.

При тестировании у вас могут быть другие классы, реализующие этот интерфейс, которые возвращают другие значения.

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

class A {
public:
   A (IFunCalc calc) { m_calc = calc; }
   void Fun { if calc.FunRet() > 4 ... }
private:
   IFunCalc m_calc;
}
class FunCalc : IFunCulc {
public:
   int FunRet { return 4; }
}
class FunCalc4Test : IFunCalc {
public:
   int FunRet { return 27; }
}
0 голосов
/ 11 января 2014

Я полагаю, FunRet - это внутренняя деталь реализации Fun. В результате, Fun не нужно тестировать отдельно от FunRet. Просто протестируйте Fun и не беспокойтесь о том, что он вызывает FunRet.

0 голосов
/ 15 июня 2011

Если вы используете внедрение зависимостей и шаблонируете свой тестируемый объект, вы можете использовать фиктивные объекты без использования виртуальных функций.

class AParameters
{
public:
  int FunRet()
  { return 4;}
};

class MockAParameters
{
public:
  MOCK_METHOD0(FunRet, int());
};

template<class Parameters>
class AImpl
{
public:
   AImpl(Parameters& parameters):parameters(parameters){}

  void Fun()
  {
    if(parameters.FunRet()>0){///} else {///}
  } 

private:
   Parameters& parameters;
};

typedef AImpl<AParameters> A;
typedef AImpl<MockAParameters> ATestObject;

void Test::funUsesFunRet()
{
    MockAParameters params;
    EXPECT_CALL(params, FunRet());
    ATestObject object(params);
    object.Fun();
}
0 голосов
/ 08 июня 2011

Я думаю, вам не хватает этого указателя.

... if ( this->FunRet() > 0 ) { ...

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