2013-08-19 39 views
2

我使用Given/When/Then模式使測試代碼更清晰。由於我用C++編寫這些測試,我選擇使用Google Test。隨着測試的花紋清晰,因爲我折騰這樣的:如何使用Given/When/Then模仿模擬(Google Mock)?

TEST(TestFixture, TestName) 
{ 
    // Given 
    int a = 5; 
    int b = 6; 
    int expectedResult = 30; 

    // When 
    int result = Multiply(a, b); 

    // Then 
    EXPECT_EQ(expectedResult, result); 
} 

但隨着嘲笑它停止,因爲沒有出現在給定的某些部分是預期明確。給定部分假設是一個設置步驟。請看一個例​​子:

TEST(TestFixture, TestName) 
{ 
    // Given 
    int a = 5; 
    int b = 6; 
    int expectedResult = 30; 

    MightCalculatorMock mock; 

    EXPECT_CALL(mock, multiply(a,b)) 
     .WillOnce(Return(expectedResult)); 

    // When 
    int result = Multiply(mock, a, b); 

    // Then 
    EXPECT_EQ(expectedResult, result); 
} 

這種方法是否正確?給定/何時/那麼評論應該放在測試代碼中,在哪裏?

回答

1

EXPECT_CALL宏可以被認爲是一種測試類和另一個類之間的交互的方式。因此,如果您將其與另一個EXPECT宏一起使用,那麼您的測試可能會測試兩件事情,這就是爲什麼它似乎與「When-Then-Then」範例(也稱爲「Arrange-Act-Assert」)衝突的原因。

如果你只需要設置一些行爲測試您的模仿對象,請使用ON_CALL宏代替:

TEST(TestFixture, TestName) 
{ 
    // Given 
    int a = 5; 
    int b = 6; 
    int expectedResult = 30; 

    MightCalculatorMock mock; 

    ON_CALL(mock, multiply(a,b)) 
     .WillByDefault(Return(expectedResult)); 

    // When 
    int result = Multiply(mock, a, b); 

    // Then 
    EXPECT_EQ(expectedResult, result); 
} 

如果你實際上是在尋找下測試和其他一些測試系統之間的iteraction合作者,您可以使用「Arrange-Expect-Act」模式:

TEST(TestFixture, CalculatorIsCalledProperly) 
{ 
    // Arrange 
    int a = 5; 
    int b = 6; 
    int expectedResult = 30; 
    MightCalculatorMock mock; 

    // Expect 
    EXPECT_CALL(mock, multiply(Eq(a),Eq(b))); 

    // Act 
    int result = Multiply(mock, a, b); 
} 
+0

Thanks! 嗯,我只是喜歡整個模式:) 無論如何,我將命名新模式AEAC,安排,期待,行爲,與檢查塊檢查功能的結果是檢查:) – Netrix