2016-10-04 2 views
1

Mocks werden verwendet, um Funktionsaufrufe zu erkennen. Was kann getan werden, wenn wir eine Klasse mit einer Funktion zum Gegenstand haben:Unit-Test, ob ein Funktionsobjekt aufgerufen wird

#include <functional> 
#include <iostream> 

using namespace std; 

class A { 
    public: 
     A(){}; 
     void doit(){ 
      //... 
      if(f) 
       f(); 
      //... 
     } 
     function<void()> f; 
}; 

int main(){ 
    A a; 
    a.f = []() { cout << "hello\n"; }; 
    a.doit(); 
} 

Gibt es eine Möglichkeit zu testen wheter f in Funktion doit() genannt wurde?

+1

können Sie eine Variable hinzufügen, die sich beim Aufruf ändert. und dann prüfen, ob es den geänderten Wert hat. – Hayt

+1

Mit Mock haben Sie 'EXPECT_CALL' – Jarod42

Antwort

1

Ich brauchte genau das vor ein paar Tagen. Was ich am Ende war, etwas zu tun wie folgt aus:

class TestHelper 
{ 
public: 
    MOCK_METHOD0(foo, void()); 
}; 

Und als, wenn ich mein Objekt instanziiert, gebe ich die verspottete Funktion oder eine Lambda, der diese Funktion genauer sein (auch std :: könnte binden).

Hinweis: Sie müssen auch deklarieren, dass Sie diesen Funktionsaufruf testen möchten. Dafür hast du EXPECT_CALL.

In Ihrem Beispiel würde es so aussehen:

TEST(My_test) 
{ 
    A a; 
    TestUtil helper; 
    EXPECT_CALL(helper, foo()).Times(1); // Or whatever other matcher and action you want to test. 
    a.f = []() { helper.foo(); }; 
    a.doit(); 
} 

Beachten Sie, dass dies zu tun google-mock müssen.

+0

Nur' mit FMock = testen :: MockFunction ; 'anstelle von' TestHelper'; siehe https://github.com/google/googletest/blob/master/googlemock/docs/CheatSheet.md#mock-classes – PiotrNycz

Verwandte Themen