2016-08-17 5 views
2

Пожалуйста, обратите внимание ниже образец кодаgmock GTEST как настроить макет

NodeInterface * pPreNode = NULL; 
NodeInterface * pChild = NULL; 

for (uint16_t Index = 0; Index < Children.size(); ++Index) 
{ 
    pChild = Children[Index]; 
    if (pPreNode == NULL) 
    { 
     pChild->SetPrevious(pChild); 
     pChild->SetNext(pChild); 
    } 
    else 
    { 
     pChild->SetNext(pPreNode->GetNext()); 
     pChild->SetPrevious(pPreNode); 
     pPreNode->GetNext()->SetPrevious(pChild); 
     pPreNode->SetNext(pChild); 
    } 
    pPreNode = pChild; 
} 

Чтобы проверить эти строки, как настроить макет именно? Children - это vector узлов, и мы передаем объекты, издевавшиеся над объектом.

EXPECT_CALL(Obj, GetNode()).WillOnce(Invoke(this, &GetANewNode)); 

и GetANewNode обеспечит новый MockedNode

MockedNode * GetANewNode() 
{ 
    MockedNode * pMockedNode = new MockedNode(); 
    return pMockedNode; 
} 

Как обеспечить точные узлы для каждого Next(), Previous() звонков?

EXPECT_CALL(*pMockedNode, SetNext(_)); 
EXPECT_CALL(*pMockedNode, SetPrevious(_)); 
EXPECT_CALL(*pMockedNode, GetNext()); 
EXPECT_CALL(*pMockedNode, GetPrevious()); 

ответ

1

Простое решение состоит в том, чтобы все предопределенные узлы были предварительно заданы перед тестовым случаем. И используйте Sequence/InSequence, чтобы убедиться, что все происходит в правильном порядке.

class ObjTest : public ::testing::Test 
{ 
protected: 
    const std::size_t N = ...; // I do not know how many do you need 
    std::vector<MockedNode> mockedNode; 
    std::vector<Node*> children; 
    Sequence s; 
    .... Obj; // I am not sure what is Obj in your question 
    ObjTest() : mockedNode(N) 
    {} 
    void SetUp() override 
    { 
     // initial setup 
     EXPECT_CALL(Obj, GetNode()).WillOnce(Return(&mockedNode.front())).InSequence(s); 
    } 
}; 

Имея такой тестовый класс с начальной настройки - вы можете создавать тестовые испытания различных сценариев, которые происходят после первоначальной последовательности:

TEST_F(ObjTest, shouldLinkOneNodeToItself) 
{ 
    std::vector<Node*> children { &mockedNode[0] }; 
    EXPECT_CALL(mockedNode[0], SetNext(&mockedNode[0])).InSequence(s); 
    EXPECT_CALL(mockedNode[0], SetPrevious(&mockedNode[0])).InSequence(s); 
    Obj.testedFunction(children); // you have not provided your tested function name... 
} 

И очень подобный тест случае для двух детей:

TEST_F(ObjTest, shouldLinkTwoNodesToEachOther) 
{ 
    std::vector<Node*> children { &mockedNode[0], &&mockedNode[1] }; 
    // first interation 
    EXPECT_CALL(mockedNode[0], SetNext(&mockedNode[0])).InSequence(s); 
    EXPECT_CALL(mockedNode[0], SetPrevious(&mockedNode[0])).InSequence(s); 
    // second iteration 
    EXPECT_CALL(mockedNode[0], GetNext()).WillOnce(Return(&mockedNode[0])).InSequence(s); 
    EXPECT_CALL(mockedNode[1], SetNext(&mockedNode[0])).InSequence(s); 
    EXPECT_CALL(mockedNode[1], SetPrevious(&mockedNode[0])).InSequence(s); 
    // etc... 

    Obj.testedFunction(children); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^