2016-07-15 24 views
1

Der Konstruktor meiner Klasse öffnet eine Datei und liest einige Daten daraus. Der Konstruktor nimmt kein Argument.Wie testen Sie die Bedingungen im Konstruktor mit gtest?

Der Dateiöffnungsteil muss innerhalb des Konstruktors erfolgen.

Wie testen Sie die Bedingungen in einem solchen Konstruktor mit gtest?

+0

Wenn Sie Ihren Konstruktor testen möchten, können Sie ihn im Fehlerfall hineinwerfen und testen, ob kein Wurf vorliegt. Sie könnten ein neues Design verwenden, um ein Argument als "Stream" oder eine andere Schnittstelle zu verwenden, damit Sie es sich vorstellen können und eine bessere Kontrolle haben, um Ihre Klasse zu testen. – Jarod42

+0

Ich stimme dem vorherigen Kommentar zu. Verwenden Sie die Abhängigkeitsinjektion und injizieren Sie ein reales Objekt oder einen Mock, der die tatsächliche Dateiöffnung ausführt oder emuliert. –

Antwort

-1

Schnelle Antwort ist: Es gibt jetzt die gegebenen Informationen gegeben.

Wenn jedoch das geöffnete Dateihandle oder ein verwandtes Flag/eine Variable geschützt ist, besteht eine Technik mit gtest darin, von Ihrer Klasse zu erben und die abgeleitete Klasse für den Zugriff auf diese Daten zu verwenden und sie zu testen.

Als eine Randnotiz sollten Konstruktoren keine Sachen machen: in Ihrem Beispiel, stellen Sie sich vor, dass das Dateisystem Ihnen aus irgendeinem Grund nicht erlaubt, die Datei zu öffnen. Wie wirkt sich das auf das Klassenverhalten aus? Du kannst nicht sagen. Daher haben Sie möglicherweise undefiniertes Verhalten von Ihrer Klasse und Sie haben keine Kontrolle darüber.
Noch schlimmer ist die Wurf Ausnahme Vorschlag aus dem gleichen Grund. Verwenden Sie die Abhängigkeitsinjektion in Ihrem Konstruktor oder machen Sie Ihre Klasse zu einer Vorlagenklasse, sodass Sie die injizierte Richtlinie steuern können.

+1

Exceptions innerhalb eines Konstruktors zu werfen, um Fehlerbedingungen anzuzeigen, ist ein standardisiertes und akzeptiertes Codierungsmuster. – Smeeheey

+0

@Smeethey: Es gibt eine Diskussion darüber im Internet. Eine Exception zu werfen ist das Standard-_but_ Sie müssen daran denken, es von außen zu erfassen, dh Sie müssen einen Nebeneffekt von Ihrem Klassenkonstruktor annehmen. Die Verwendung einer 'init()' Methode ist gültig, aber dann müssen Sie in der Multithreading Umgebung vorsichtig sein. In btth-Fällen müssen Sie etwas auf der Außenseite tun, aber wenn Sie Konstruktor einwerfen, müssen Sie ein Verhalten annehmen, das in der Klassen-API nicht vorhanden ist. Das ist eine Art Geschmack. – fedino

+1

Ja, es ist eine Frage der Wahl. Beide Ansätze sind gültig, Menschen können Präferenz für das eine oder andere haben. Daher stimme ich Ihrer Ungültigkeit des Throw-Ansatzes in Ihrer Antwort nicht zu. Außerdem: "Als Nebenbemerkung sollten Konstrukteure nichts tun" - dies ist wiederum eine Meinung (eine, die denen, die an RAII glauben, ins Wasser fliegt) als akzeptierte Tatsache angegeben. – Smeeheey