2015-04-01 15 views
5

Bir şablon sınıfını gtest ile test etmek istiyorum. TYPED_TEST s hakkında en çok okunan el kitabını okudum ve başvuru yaptıkları resmi örneğe (samples\sample6_unittest.cc) baktım. Örnekteki bu şablon sadece bir şablon parametresine sahiptir. Ancak, kodumun iki şablon parametresi var, nasıl test edebilirim? Aşağıda test kodu yazmış olanC++ şablon sınıfını, gtest kullanarak birden çok şablon parametresiyle nasıl test edebilirsiniz?

// two element type 
template <typename E, typename F> 
class QueueNew 
{ 
public: 
    QueueNew() {} 
    void Enqueue(const E& element) {} 
    E* Dequeue() {} 
    F size() const 
    { 
     return (F)123; 
    } 
}; 

:

error C2976: 'QueueTestNew' : too few template arguments 
see declaration of 'QueueTestNew' 
... 

I:

template <class E, class F> 
QueueNew<E, F>* CreateQueue(); 

template <> 
QueueNew<int, int>* CreateQueue<int, int>() 
{ 
    return new QueueNew < int, int > ; 
} 
template <> 
QueueNew<char, char>* CreateQueue<char, char>() 
{ 
    return new QueueNew < char, char > ; 
} 

template <class E, class F> 
class QueueTestNew; 

template <class E> 
class QueueTestNew<E, int> : public testing::Test 
{ 
protected: 
    QueueTestNew() : queue(CreateQueue<E, int>()){} 
    virtual ~QueueTestNew(){ delete queue; } 
    QueueNew<E, int>* const queue; 
}; 

template <class E> 
class QueueTestNew<char, E> : public testing::Test 
{ 
protected: 
    QueueTestNew() : queue(CreateQueue<char, E>()){} 
    virtual ~QueueTestNew(){ delete queue; } 
    QueueNew<char, E>* const queue; 
}; 

// The list of types we want to test. 
typedef ::testing::Types <char, int> Implementations; 

TYPED_TEST_CASE(QueueTestNew, Implementations); 

TYPED_TEST(QueueTestNew, DefaultConstructor) 
{ 
    EXPECT_EQ(123u, this->queue->size()); 
} 

ama bina, hatası alıyorum

Aşağıdaki kod var test şablonu yöntemimin gtest ile yanlış olduğunu düşünüyorum, bu yüzden nasıl yapmalıyım?

+0

Bunu yapmak için, aşağıdaki gibi bir templated yapısını tanımlayabilir alt tiplerin her biri. Daha sonra bu yapı tarafından tür parametreli hale getirin (ek şablon paramlarını yerleştirerek). – SleuthEye

+0

Üzgünüm, anlamadım. – thinkerou

cevap

8

Bir hile, gtest'in iç içe türlerle tek bir tip parametresi görmesini sağlamak olabilir.

template <typename A, typename B> 
struct TypeDefinitions 
{ 
    typedef typename A MyA; 
    typedef typename B MyB; 
}; 

Eğer yazılı test fikstürüne geçebilir Hangi: Böyle için birden typedefs ile bir yapı olarak bir tür tanımlayabilirsiniz

template <class T> 
class QueueTestNew : public testing::Test 
{ 
protected: 
    QueueTestNew() : queue(CreateQueue<typename T::MyA, typename T::MyB>()){} 
    virtual ~QueueTestNew(){ delete queue; } 
    QueueNew<typename T::MyA, typename T::MyB>* const queue; 
}; 

// The list of types we want to test. 
typedef ::testing::Types <TypeDefinitions<char,char>, 
          TypeDefinitions<int,int> > Implementations; 

TYPED_TEST_CASE(QueueTestNew, Implementations); 

TYPED_TEST(QueueTestNew, DefaultConstructor) 
{ 
    typename TypeParam::MyA someA; // if you need access to the subtypes in the test itself 

    EXPECT_EQ(123u, this->queue->size()); 
} 
+0

Oh bravo. Anladım, çok fazla! Şablon ve typename çok güçlü! – thinkerou

İlgili konular