2016-03-20 8 views
2

Googleテストで使用できる入力テストコンセプトを使用しようとしています。このコンセプトの説明は、私がしようとしているものと一致しますが、完全に理解することはできません。私はインターフェイスを実装している構造体をテストしたいのですが、それらは全く異なるので、異なる値/インスタンスで初期化する必要があります。Googleテストを使用してインタフェースを実装するさまざまなクラス/構造体をテストするにはどうすればよいですか?

struct Serializable 
{ 
    virtual sObj serialize() = 0; 
    virtual void unserialize(sObj) = 0; 
}; 

struct s1 : serializable 
{ 
    int attrI1; 
    int attrI2; 
    sObj serialize() 
    { 
    //serialize an instance of this struct 
    } 
    void unserialize(sObj) 
    { 
    //unserialize data to instance of this struct 
    } 
} 

struct s2 : serializable 
{ 
    char attrC; 
    void serialize() 
    { 
    //serialize an instance of this struct 
    } 
    sObj unserialize() 
    { 
    //unserialize data to instance of this struct 
    } 
} 

を次のように

は単に私のコードがあると私は別のインスタンス/値でs1とs2をテストしたいです。テストは次のようになります:

template <typename T> 
int testSerialzable(T& t) 
{ 
    sObj obj = t.pack(); 

    T temp; 
    TEST_EQ(temp.unpack(obj), t); 
} 

誰かがこれを実行することができますかどうか教えてください。 あらかじめ多くのありがとうございます

答えて

1

私はそれを最後に理解しました。私が上に持っていた例のために。それは次のようになります:

template<class T> 
struct TestSerializable : public ::testing::Test 
{ 
    static T serializedType; 
}; 

TYPED_TEST_CASE_P(TestSerializable); 

TYPED_TEST_P(TestSerializable, serializationTest) 
{ 
    sObj obj = t.serialize(); 

    TypeParam temp; 
    ASSERT_EQ(temp.unserialize(obj), t); 
} 

REGISTER_TYPED_TEST_CASE_P(TestSerializable, serializationTest); 


typedef ::testing::Types<s1, s2> MyTypes; 
INSTANTIATE_TYPED_TEST_CASE_P(MySerialiInstantiation, TestSerializable, MyTypes); 


template<> s1 TestSerializable<s1>::serializedType(/*instance of s1 with proper values*/s1()); 
template<> s2 TestSerializable<s2>::serializedType(/*instance of s1 with proper values*/s2()); 
-2

value-parameterized testsをインターフェイスのさまざまな実装のテストに使用する方が便利です。 Google Testのsample7は、その方法を示しています。

+0

異なるタイプのタイプです。テスト対象の型の一時インスタンスを作成する必要があるため、値パラメータ化されたテストは使用できません。 – Mass