Mi sto concentrando sulla scrittura di codice facile da testare in questi giorni e mi rendo conto che la maggior parte delle mie lezioni seguono lo scheletro sottostante:
Alcune classi ObjectManager hanno bisogno di DatabaseRepo , mentre c'è solo un tipo DatabaseRepo in produzione ( OracleRepo ), lo sto ancora implementando con un'interfaccia perché voglio essere in grado di prendere in giro la DatabaseRepo , quindi ho bisogno di usare il polimorfismo. Inietto DatabaseRepo come unique_ptr al costruttore di ObjectManager , per indicare che ObjectManager possiede DatabaseRepo .
Una cosa, ad esempio, che è difettosa qui è che nel test unitario, accedo allo stato di MockRepo dopo che l'ho spostato in ObjectManager . Anche se è sicuro ( ObjectManager ) è ancora vivo, sembra un hack.
Domanda: Usando questo come schema generale per la situazione in cui la classe A ha un oggetto di tipo B , ci sono aspetti di progettazione che potrei migliorare?
class ObjectManager {
public:
ObjectManager(std::unique_ptr<DatabaseRepo> initRepo) : repo(initRepo) {
}
void process() {
repo->updateRecords();
}
private:
std::unique_ptr<DatabaseRepo> repo;
};
class DatabaseRepo {
public:
virtual void updateRecords = 0;
}
class OracleRepo : public DatabaseRepo {
public:
void updateRecords() overrides {
}
}
class MockRepo : public DatabaseRepo {
public:
void updateRecords() overrides {
}
}
testObjectManager() {
std::unique_ptr<DatabaeRepo> mockrepo =
std::unique_ptr<DatabseRepo>(new MockRepo);
ObjectManager om(std::move(mockrepo));
om.process();
EXPECT_CALLED_ONCE(mockrepo.get()->updateRecords());
}