問題タブ [cmockery]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
gcc - cmockery.c をコンパイルするときの GCC の「エラー: 'SourceLocation*' から 'int' へのキャストで精度が失われます」というエラーを回避するにはどうすればよいですか?
Cmockeryを使用した単体テストを、手作りの Makefile として使用する既存のビルド環境に追加する必要があります。したがって、cmockery.c を (automake なしで) ビルドする方法を理解する必要があります。
私が実行すると:
次のようなエラーの長いリストが表示されます。
cmockery.c の 247:248 行目は次のとおりです。
assert_true
cmockery.h の 154 行目で定義されています。
したがって、(エラー状態として) 問題は、GCC が「SourceLocation*」から「int」へのキャストを好まないことです。
./configure
and を使用してCmockery をビルドできますmake
(最初に Linuxを使用した場合、Mac OS Xを使用した場合export CFLAGS=-I/usr/include/malloc
)、エラーは発生しません。実行時に cmockery.c をコンパイルするコマンドラインを調べてみましたmake
(後./configure
):
...しかし、このエラーを回避するオプションはありません。
「エラー: 'void*' から 'int' へのキャストで精度が失われました」では(int)
、cmockery.h を(intptr_t)
. そして、私はそれが機能することを確認しました。しかし、Cmockery は./configure
andmake
でビルドできるので、ソースを変更せずにビルドする方法が必要です。
c++ - C++ コードをコンパイルして、コンパイル済みの C コードとリンクするにはどうすればよいですか?
Cmockeryを使用して、テスト中の C++ コードから呼び出される C 関数をモックできるようにしたいと考えています。そのためのステップとして、Cmockery の例の名前をrun_tests.cから run_tests.cpp に変更し、コンパイルして cmockery.c とリンクしようとしています。
最初の 2 つのコマンド ライン (コンパイル用) は成功していますが、最後のコマンド ラインの後は次のようになります。
その未定義のシンボルは、run_tests.cpp の 29 行目からのものです。
run_tests() 関数は cmockery.c で定義されています。
「「gcc」を使用した C++ コードのリンク (g++ なし) 」を読んだ後、次のことを試しました。
しかし、同じ結果を得ました:
C++ コードをコンパイルおよびリンクして、C コード内のシンボルを検出するにはどうすればよいですか?
c++ - C++ から C 関数を呼び出すときに型キャストの制限を緩和するように gcc に指示するにはどうすればよいですか?
Cmockeryを使用して、C++ コードから呼び出される C 関数をモックしようとしています。SUT は C++ であるため、私のテストは C++ である必要があります。
Cmockery の expect_string() マクロを次のように使用すると、次のようになります。
私は得る:
cmockery.hで、 expect_stringが定義されていることがわかります。
そして、これが _expect_string のプロトタイプです (cmockery.h から):
問題は、私が C コードを C++ としてコンパイルしていることだと思います。そのため、C++ コンパイラは(void*)string
、expect_string_count マクロがconst char* string
_expect_string() 関数にパラメーターとして渡されることに反対しています。
私はすでにextern "C"
次のように my_tests.cpp に含まれる cmockery.h を使用しています。
...名前マングリングの問題を回避するため。(「C++ コードをコンパイル済みの C コードでコンパイルおよびリンクするにはどうすればよいですか?」を参照してください) 。
テストの C++ コードから cmockery.c の C 関数への型キャストに関する制限を緩和する方法を g++ に伝えるコマンド ライン オプションまたはその他の手段はありますか?
これは、my_tests.cpp をビルドするために現在使用しているコマンドです。
c - CMockeryモック、重複シンボルエラー
CMockeryモックで、重複するシンボル警告が発生するという問題が発生しています。
コードの実装は非常に長いので、ここに要点があります。
Gistには、test(.c
)、implementation( )、およびヘッダーファイルが含まれています。プロジェクトは、を使用し.c
てビルドCMake
およびテストされます。CTest
CMockery
実際のエラーは次のとおりです。
私が思いついた回避策はchar *wit_configuration_file_path()
、として宣言することでしたstatic
。実装はint wit_load_configuration(wit_configuration config)
私が期待した実装と同じファイルにあるので、実際にはきれいにコンパイルおよびリンクされます。wit_configuration_file_path()
残念ながら、静的であると宣言することの副作用として、モックを使用することはありません。
cmockeryのグーグルの例はあまりにも工夫されており、これにどのように対処すべきかを説明していません。
関数を次のように宣言しない方が賢く、テストが簡単になる可能性もあります。
むしろ:
その場合、私は何もモックしたりスタブしたりする必要はありません。しかし、将来何かをモックする必要があると予想しているので、問題が再発して私を噛むと信じています(そうでなければ、包括的な単体テストをどのように書くことができますか?)
1:これを適切に行うにはどうすればよいですか。static
つまり、モックを使用せずstatic
、重複するシンボルエラーを発生させずに宣言します。
2:APIのデザインを変更する必要がありますか?この場合はうまくいくでしょうが、関数を正しくモックする方法を知りたいです。
3:ライブラリ全体に対してテストをリンクするのは間違いですか、CMakeを使用しており、テストのtarget_link_libraries(libwatcheditTest watchedit)
行を使用しています。CMakeLists.txt
更新:診断に役立つビルド出力をここに追加しました
c - プロジェクトで cmockery を使用する方法
cmockery に出くわすまで、C コードでモック オブジェクトを作成する方法を探していました。私にとっては、依存関係があまりないため、利用可能な最高のモッキング ソフトウェアのようです。
私はubuntuで作業しており、https: //code.google.com/p/cmockery/downloads/listからtarball cmockeryをダウンロードしました
./configure、make、make install を実行しました。
与えられた例を実行することはできますが、自分のプロジェクトでそれを機能させる方法がわかりません。configure と makefile を見て、彼らがどのようにそれを行ったかを調べてみましたが、成功しませんでした。私の問題を引き起こしているのはリンクだと思います。
cmockery のファイルは次の場所にあります。
サンプルファイルのcalculator.cとcalculator_test.cを別のディレクトリにコピーして、そこでコンパイルしてみました。これは私がしたことです:
最後のステップで、cmockery に固有のすべての関数への多くの未定義の参照とエラーを取得しました。
私はリンカーで物事を台無しにしていると思いますが、それを正しく行う方法がどこにも見つかりません。
c - cmockaで関数ラッピングを一時的に有効および無効にする正しい方法は?
cmockaライブラリを使用して、組み込みの c コードをテストしています。ドキュメントによると、__wrap_
プレフィックスを使用して関数をモックするので、単体テストを分離できます。ただし、これを行うと、関数へのすべての呼び出しは永遠にラップされた関数に移動します。特定の状況で実際の機能を再度有効にして、テストしたり、他の機能が使用できるようにしたりするにはどうすればよいですか? 唯一の方法は、グローバルフィールドをスイッチとして使用して実際の関数を次のように呼び出すことです。
それは正しい方法ですか?
c - CMockery でテストされた関数が別の特定の関数を呼び出すかどうかを確認する
以下に示す関数の CMockery を使用してモック コードを作成する際に問題に直面しています。ヒントを教えてください。が呼び出されたかどうかをテストし、startCalCompute
に値を代入してupdateMode
、 と等しくならないようにしたいと考えていSYSTEM_CAL_CONFIG
ます。必要なのは出発点またはヒントだけです。
foo.c
testfoo.c