Come semplificare i test unitari con funzioni di ordine superiore?

2
  • questa è non una domanda su come scrivere test di unità
  • questa è non una domanda su cosa testare
  • questa è una domanda sulla riduzione della tipizzazione necessaria in generale per un framework di test personale

So che puoi inviare i puntatori di funzione come argomenti alle funzioni in C.

Esiste una versione c ++ 98? Oppure, dato che c ++ può funzionare all'indietro, dovrei semplicemente usare il metodo del puntatore a forma di C?

Sto cercando di scrivere una funzione che testa le funzioni per me. Non voglio scrivere una lunga lista di:

try {
  func1()
  out << fail
} except e {
  out << pass
}

if (func2(arg2) == expected_val) {
  out << pass
else
  out << fail

try/catch...
try/catch...
if/else...
try/catch...
...etc

ma forse invece:

test_this(func1, passes_on_exception)
test_this(func2, ! passes_on_exception, expected_val2, arg2)
test_this(func3, passes_on_exception)
test_this(func4...
test_this(func5...
...etc

void test_this(func_name, pass_on_exception, expected_value, arg1, ..., argn) {
  if pass_on_exception {
      try {
          func_name(arg1)
          out << fail
      } catch e {
          out << pass
      }
  } else {
      if func_name == expected_value {
          out << pass
      } else {
          out << fail
      }
  }
}

Le funzioni virtuali sembrano fuori discussione dal momento che, se ricordo correttamente, i nomi delle funzioni devono essere sovrascritti / codificati; come in, avrei bisogno di creare una nuova classe per ereditare e sovrascrivere le funzioni, nel qual caso, vorrei ridichiarare la funzione, e anche ridigitare tutte quelle try / catch ... la catena di try / catch / if / else sembra meglio.

Se ci fosse un modo per passare i nomi delle funzioni ad altre funzioni, penso di poterlo capire da lì. A meno che quanto sopra non sia effettivamente possibile in C ++, per favore fermatemi prima di iniziare, e mi limiterò a sopportare quel lungo elenco di test / catch / if / else. Quindi, domanda principale: c'è un modo per fare quanto sopra? In caso contrario, alternative?

    
posta user2738698 25.03.2014 - 16:56
fonte

1 risposta

1

Sì, puoi usare i puntatori di funzione in C ++, più in generale puoi usare la funzione std :: tr1 :: per qualsiasi tipo di cosa chiamabile (funzione, metodo o lambda) per es.

// Use <functional> for C++11
#include <tr1/functional>
#include <iostream>

using namespace std;
using namespace std::tr1;

void first(function<void()> f)
{
  f();
}

void second()
{
  cout << "second\n";
}

int main()
{
  first(second);
}
    
risposta data 25.03.2014 - 17:05
fonte

Leggi altre domande sui tag