2017-11-12 18 views
2

TESTにDefaultValue<int>::Set(10)を置くと、すべて正常に動作しますが、外に置くとエラーが発生します。なにが問題ですか?根本的な原因は?gmockのDefaultValueのスコープの問題

using ::testing::DefaultValue; 
struct Foo { 
    MOCK_METHOD0(doWork, int()); 
}; 

DefaultValue<int>::Set(10); // error: specializing member 'testing::DefaultValue<int>::Set' requires 'template<>' syntax; 

TEST(BarTest, DoesThis) { 
    Foo foo; 
    DefaultValue<int>::Set(10); // everything works fine. 
    EXPECT_CALL(foo, doWork()); 
    foo.doWork(); 
} 

答えて

1

DefaultValue<int>::Set(10)は関数呼び出しです。これはステートメントであり、一般的なステートメントは名前空間のスコープ内では単独では表示できません。

関数のスコープに入れても問題ありません。あなたがそれをリファクタリングしたいと思うかもしれませんが、それはスイートをテストする前に一度だけ実行されます(結局、グローバルなデフォルト値を持つ点です)。

あなたが関数の外に置いたときのエラーは、コンパイラの混乱のためです。 DefaultValue<int>のメンバ関数を特殊化しようとしているように見えるので、コンパイラは、実行できないことを実行することをあなたが意図しているかどうかはわかりません。診断は、あなたが専門的な正直な間違いをした場合、正しいことをするのに役立つ方法で表現されます。

+0

ああ、ありがとう、ストーリーテラー、マイ・不良。あなたの指摘の後、それは私には明らかですが、私はそのように考えることはできませんでした。そのような間違いの説明はありますか? – pepero

+0

@pepero - 「ファイルスコープでコードを実行する」を探している場合は、数通りのヒットがあると思います。 – StoryTeller