Cでのユニットテストでは、お互いの関数を呼び出す2つのオブジェクトファイル(AとB)をプロダクションソースにビルドします。ユニットテストのためにAとBのモック/フェイクの実装を提供します。これは、ユニットテストのために実行時に切り替えられるようになっています。コンパイル時のCユニットテスト用の関数リンケージの書き換えまたは中断
実行可能にしたいことは、A、B、fake_A、およびfake_Bを1つの大きなテストバイナリにリンクすることです。実行時とユニットテストの両方で、モジュールのプロダクションと偽の実装を切り替えることができます。 これは、すべてのケースで複数の異なるテストバイナリを作成し、結果を統合する必要がないようにすることが望ましいからです。
ユニットテストのためにAとBをコンパイルするので、実行時には存在しない余分なヘッダー、定義、コンパイラフラグなどを強制することができます。
AとBの関数間のリンケージを何らかの書き換えやリンク時のトリックで壊すことができるのだろうかと思います。
私は説明しようとしましょう。 (
交流
void a_work(void) {
b_work();
}
BC
void b_work(void) {
do_some_work();
}
fake_b.c
/* for test, when a_work() calls b_work() I want this to be run */
void b_work(void) {
if (fake_b_enabled)
do_fake_b_work();
else
// call the real b_work() somehow
}
通常のa_work:のは、私は、ファイルにAC、BC、fake_a.cとfake_b.cを持っているとしましょう)のb_work()への呼び出しは、リンク時に実際のb_work()にリンクされます。これは、私が傍受したり書き換えたいことです。
私は関数ポインタレイヤーで何らかのラッピングを考えていますが、それを行う方法はわかりません。
別のオブジェクトファイルとリンクしないのはなぜですか? –
@OliCharlesworthどういう意味ですか?興味深いアイデア。 – blueshift