Ich stellte diese Frage vorher unter einem anderen Namen aber löschte es, weil ich es nicht sehr gut erklärte.Einheit testet private Methode in der Ressource, die Klasse (C++) verwaltet
Sagen wir, ich habe eine Klasse, die eine Datei verwaltet. Lassen Sie uns sagen, dass diese Klasse die Datei behandelt ein bestimmtes Dateiformat haben, und enthält Methoden Operationen auf diese Datei auszuführen:
class Foo {
std::wstring fileName_;
public:
Foo(const std::wstring& fileName) : fileName_(fileName)
{
//Construct a Foo here.
};
int getChecksum()
{
//Open the file and read some part of it
//Long method to figure out what checksum it is.
//Return the checksum.
}
};
Lassen Sie uns sagen, dass ich das Teil dieser Klasse Unit-Test in der Lage sein möchten, dass berechnet die Prüfsumme. Unit testet die Teile der Klasse, die in der Datei geladen werden, und das ist unpraktisch, weil ich jeden Teil der getChecksum()
Methode testen muss, muss ich 40 oder 50 Dateien erstellen!
Jetzt sagen wir, ich möchte die Prüfsummenmethode an einer anderen Stelle in der Klasse wiederverwenden. Ich extrahieren Sie die Methode, so dass es jetzt so aussieht:
class Foo {
std::wstring fileName_;
static int calculateChecksum(const std::vector<unsigned char> &fileBytes)
{
//Long method to figure out what checksum it is.
}
public:
Foo(const std::wstring& fileName) : fileName_(fileName)
{
//Construct a Foo here.
};
int getChecksum()
{
//Open the file and read some part of it
return calculateChecksum(something);
}
void modifyThisFileSomehow()
{
//Perform modification
int newChecksum = calculateChecksum(something);
//Apply the newChecksum to the file
}
};
Nun möchte Ich mag die calculateChecksum()
Methode Einheit testen, weil es einfach ist, zu testen und zu kompliziert, und ich kümmere mich nicht um Unit-Tests getChecksum()
, weil es einfach und sehr schwierig zu testen. Aber ich kann calculateChecksum()
nicht direkt testen, weil es private
ist.
Kennt jemand eine Lösung für dieses Problem?
+1 Ich nehme an, das könnte für dieses spezielle Szenario funktionieren - aber ich hoffe auf eine allgemeinere Antwort, die für jede Art von Ressource verwalten würde, sei es Registrierungsschlüssel, Datei, Pipe, etc. Sorry ich war nicht ganz klar genug in der Frage :( –