Насмешливые занятия с шаблонными методами - PullRequest
0 голосов
/ 29 апреля 2020

Существует ли какой-либо шаблон для тестирования классов, которые используют классы, содержащие методы шаблона, в publi c api? Я знаю, что в динамическом c интерфейсе моделирования полиморфизма это решение выглядит следующим образом:

struct Interface {
 virtual void foo() = 0; 
 virtual ~Interface() = default;
};

class TestedClass {
public:
  TestedClass(Interface& i) {}
  // ... rest of the class
};

struct IMock : public Interface {
 void foo() override {} 
};

void test() {
  IMock bar;
  TestedClass baz(bar);
}

Но что я могу сделать с чем-то, как показано ниже? Есть ли идиоматический c способ проверить это?

struct Interface {
 template<class T>
 void foo() {
   // do stuff depending on type
 }
};

class TestedClass {
public:
  TestedClass(Interface& i) {}
  // ... rest of the class
  // uses Interface foo with multiple types
};

1 Ответ

3 голосов
/ 29 апреля 2020

Чтобы разрешить насмешку, в этом случае вам нужно

template <typename InterfaceT> class TestedClass;

, чтобы вы могли теперь иметь TestedClass<Interface> (для производства) и TestedClass<MockInterface> (для тестирования).

struct Interface {
 template<class T>
 void foo() {
   // do stuff depending on type
 }
};

template <typename InterfaceT>
class TestedClass {
public:
  TestedClass(InterfaceT& i) {}
  // ... rest of the class
  // uses Interface foo with multiple types
};

struct MockInterface {
 template<class T>
 void foo() {
   // do mock-stuff depending on type
 }
};

void test() {
  MockInterface bar;
  TestedClass baz(bar); // Or pre CTAD of C++17: TestedClass<MockInterface> baz(bar);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...