2016-05-04 11 views
0

私は単体テストの初心者です。定義しようとしている関数に対してテストダブルを定義しようとしています。おそらくそれほど大きな違いはありませんが、付属のコンパイラを使用してCortex ARM M3にIARを使用しています。テストダブルを定義するときに複数の定義を避ける方法

私がテストしようとしている関数では、シリアルインターフェイス経由でメッセージを送信する関数を呼び出します。

#ifdef UNIT_TEST 
#include "MessageController.h" 
#else 
#include "FakeMessageController.h" 
#endif 

uint8 FunctionToTest(....) 
{ 
    uint8 data[100]; 
    uint8 error; 

    //Prepare data to send here 
    SendMessage(data); 

    if (error) return 1; 
    else return 0; 
} 

私はSendMessage関数を含んでおり、別のファイルでそれにmoficationsを作った元のファイルのコピーを作成しました: は、ここで私が達成しようとしているものを説明するためにいくつかの擬似コードです。私は#ifdefステートメントを通して呼び出される関数を変更することができると考えましたが、それはその場合に当てはまります。

私は複数の定義

Error[Li006]: duplicate definitions for .... ; in "......\Tests\Debug\Obj\MessageController.o", and "....\dvlp\Debug\Tests\Debug\Obj\FakeMessageController.o" 

ための次のエラーを取得する私は完全にリンカが私のこのエラーを与えているが、この問題の回避策がある理由を理解できますか?またはリンカを正しい機能を使用するようにトリックする何らかの方法ですか? テスト機能はプロジェクト内の元のファイルへのリンクであるため、変更できません。

+0

'SendMessage'はインラインまたはマクロですか?これらのヘッダファイルは他の 'c'ファイルに含まれていますか? – LPs

+0

'FakeMessageController.h'の_definition_を削除し、そこに_declare_だけ追加します。 'MessageController.o'とリンクすると、実際のオブジェクトが使用されます。 – inetknght

+0

@LPs:SendMessageは、通常MessageController.cファイルで定義されている関数です。しかし、私はユニットテスト時にFakeMessageController.cで定義されたSendMessage関数を使用したいと考えています –

答えて

-1

ありがとうございました。私自身の解決策を見つけました。

私は#ifndefの

#ifndef UNIT_TEST 
// All the code in the MessageController.c 
#endif 

インサイドMessageController.hとMessageController.cにすべての私のコードを包み、私はこのトリックを使用:それは私の意見で最もクリーンではありません

#ifdef UNIT_TEST 
#include "FakeMessageController.h" 
#else 

// original header content 

#endif 

が、わたしにはできる。

関連する問題