そのようなコードを考えると:
class ToBeTested {
public:
void doForEach() {
for (vector<Contained>::iterator it = m_contained.begin(); it != m_contained.end(); it++) {
doOnce(*it);
doTwice(*it);
doTwice(*it);
}
}
void doOnce(Contained & c) {
// do something
}
void doTwice(Contained & c) {
// do something
}
// other methods
private:
vector<Contained> m_contained;
}
ベクトルに 3 つの値を入力すると、関数が適切な順序と数で呼び出されることをテストしたいと思います。たとえば、私のテストは次のようになります。
tobeTested.AddContained(one);
tobeTested.AddContained(two);
tobeTested.AddContained(three);
BEGIN_PROC_TEST()
SHOULD_BE_CALLED(doOnce, 1)
SHOULD_BE_CALLED(doTwice, 2)
SHOULD_BE_CALLED(doOnce, 1)
SHOULD_BE_CALLED(doTwice, 2)
SHOULD_BE_CALLED(doOnce, 1)
SHOULD_BE_CALLED(doTwice, 2)
tobeTested.doForEach()
END_PROC_TEST()
これをどのようにテストすることをお勧めしますか? CppUnit または GoogleTest フレームワークでこれを行う手段はありますか? たぶん、他のユニットテストフレームワークでそのようなテストを実行できるでしょうか?
これらの関数からデバッグ関数を呼び出さないとおそらくこれは不可能であることは理解していますが、少なくとも一部のテスト フレームワークでは自動的に実行できます。トレース ログをスキャンしてその正確性を確認するのは好きではありません。
UPD: I'm trying to check not only the state of an objects, but also the execution order to avoid performance issues on the earliest possible stage (and in general I want to know that my code is executed exactly as I expected).