1

Ich habe Probleme beim Kompilieren einer Datei mit einer Testvorrichtung mit Google Test in Visual Studio 2015. Die Klasse, die ich versuche, die Testvorrichtung für zu erstellen, heißt Counter.Standardkonstruktor der Testvorrichtung kann nicht referenziert werden

Die getestete Counter-Klasse verfügt über einen geschützten Standardkonstruktor, der verschiedene geschützte Membervariablen initialisiert. Diese Elementvariablen in der Klasse Counter enthalten Objekte, Zeiger auf const-Objekte, Ints und Doubles.

Der DefaultConstructor Test kann nicht mit der folgenden Fehlermeldung the default constructor of "CounterTest" cannot be referenced -- it is a deleted function kompiliert werden.

Um zu klären, ich versuche, ein Counter-Objekt (mit seinem Standardkonstruktor) in der CounterTest-Klasse (Test Fixture) instanziieren, um über einzelne Tests zu verwenden.

// Counter.h 
class Counter : public ConfigurationItem { 
protected: 
    EventId startEventIdIn_; 
    int numStarts_; 
    CounterConfigurationItem_Step const* currentStep_; 
    double startEncoderPosMm_; 
private: 
    FRIEND_TEST(CounterTest, DefaultConstructor); 
}; 

// GTest_Counter.cpp 
class CounterTest : public ::testing::Test { 
protected: 
    Counter counter; 
}; 

TEST_F(CounterTest, DefaultConstructor) 
{ 
    ASSERT_EQ(0, counter.numStarts_); 
} 

Was mache ich falsch? Ist es sogar möglich, dass ein Testgerät mit einer Klasse befreundet ist, die auf einen geschützten/privaten Mitgliederzugriff getestet wird? Vielen Dank!

Antwort

0

ich raten bin, dass Sie die vollständige Definition der Klasse haben Post CounterTest seit dem Code, den Sie geschrieben haben kompiliert ohne Fehler, wenn ich eine Dummy-Counter Klasse hinzufügen:

class Counter 
{ 
public: 
    int numStarts_; 
}; 

Da die Fehlermeldung deutet darauf hin, dass es ist kein Standardkonstruktor für die Klasse CounterTest, ich vermute, dass Sie der Klasse einen nicht standardmäßigen Konstruktor hinzugefügt haben. In C++ bedeutet dies, dass der Standardkonstruktor entfernt wird, wenn Sie keinen explizit angeben. Dies ist ein Problem, da googletest Test-Fixture-Klassen instanziiert, die nur einen Standardkonstruktor verwenden. Sie können nicht einen nicht standardmäßigen verwenden, um ein Test-Fixture zu instanziieren. Wenn Sie vor jedem Test verschiedene Aktionen ausführen müssen, können Sie die Version der Methode SetUp mit Parametern zur Fixture-Klasse hinzufügen und sie zu Beginn jedes Tests mit den gewünschten Eingabeargumenten aufrufen.

+0

Ich habe der Klasse ** CounterTest ** keinen nicht standardmäßigen Konstruktor hinzugefügt. Ich habe nichts aus der oben gezeigten ** CounterTest ** -Klasse übrig gelassen, es ist genau so, wie es in meinem tatsächlichen Code ist. Ich habe der Counter-Klasse seit Ihrem Kommentar einige zusätzliche Interface-Details hinzugefügt. – GnUfTw

0

Lösung: Erklären CounterTest als Freund Klasse.

class Counter : public ConfigurationItem { 
protected: 
    EventId startEventIdIn_; 
    int numStarts_; 
    CounterConfigurationItem_Step const* currentStep_; 
    double startEncoderPosMm_; 
private: 
    friend class CounterTest; 
    FRIEND_TEST(CounterTest, DefaultConstructor); 

};

Verwandte Themen