2015-04-01 15 views
5

Tôi muốn thử nghiệm một lớp mẫu có gtest. Tôi đọc khoảng TYPED_TEST s trong hướng dẫn sử dụng gtest và xem ví dụ chính thức (samples\sample6_unittest.cc) mà chúng tham chiếu. Mẫu này từ ví dụ này chỉ có một tham số mẫu. Nhưng, mã của tôi có hai tham số mẫu, làm thế nào tôi có thể kiểm tra nó?Làm thế nào để kiểm tra lớp mẫu C++ với nhiều tham số mẫu sử dụng gtest?

Tôi có đoạn mã sau:

// 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; 
    } 
}; 

mà tôi đã viết mã kiểm tra dưới đây:

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()); 
} 

nhưng khi xây dựng, tôi nhận được lỗi:

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

tôi nghĩ rằng phương pháp mẫu thử nghiệm của tôi với gtest là sai, vì vậy tôi nên làm như thế nào?

+0

Bạn có thể định nghĩa một kiểu như một cấu trúc với nhiều typedefs cho mỗi loại phụ của bạn. Sau đó, tạo 'QueueTestNew' thành kiểu-parametrized bởi cấu trúc đó (lồng các tham số mẫu bổ sung). – SleuthEye

+0

Xin lỗi, tôi không hiểu. – thinkerou

Trả lời

8

Bí quyết là làm cho gtest thấy một thông số loại đơn, với các loại lồng nhau. Để làm điều này, bạn có thể định nghĩa một cấu trúc templated như:

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

Mà bạn có thể vượt qua để bạn cố gõ-test:

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. hiểu rồi, thx rất nhiều! Template và typename rất mạnh! – thinkerou

Các vấn đề liên quan