【问题标题】:Oneliner for testing std::vector contents用于测试 std::vector 内容的 Oneliner
【发布时间】:2012-11-01 14:21:17
【问题描述】:

有什么更方便的方法:

EXPECT_EQ(mock->params.size(), 2);
EXPECT_EQ(mock->params[0], "firstCall");
EXPECT_EQ(mock->params[1], "secondCall");

上面的一个问题是,在进行测试驱动开发时,测试用例会崩溃,其中 mock->params 的大小将首先为零,然后才能编写实际的测试代码。

顺便说一句,我不允许使用 GoogleMock,因为它需要某些我无法使用的编译器标志。我可以使用 std 和 boost。

【问题讨论】:

  • 不会使用ASSERT_EQ 代替EXPECT_EQ 工作吗?这将立即退出函数。

标签: c++ boost tdd googletest c++98


【解决方案1】:

您可以尝试使用Boost.Assign。例如,list_of 序列可以与向量进行比较:

live demo

#include <iostream>
#include <ostream>
#include <vector>
#include <boost/assign/list_of.hpp>
using namespace std;
using namespace boost::assign;

int main()
{
    vector<int> v;
    v.push_back(0);
    v.push_back(1);
    cout << (v == list_of(0)(1) ) << endl;
    cout << (v == list_of(1) ) << endl;
    cout << (v == list_of(1)(2) ) << endl;
}

输出是:

1
0
0

【讨论】:

    【解决方案2】:

    不是一个班轮,但应该做你想做的事:

    std::vector<std::string> expected;
    expected.push_back("firstCall");
    expected.push_back("secondCall");
    EXPECT_EQ(mock->params,expected);
    

    否则我建议使用ASSERT_EQ() 进行第一次测试,以防止您的测试用例崩溃,正如@Rook 在他的评论中所说的那样(这就是它的设计目的)。

    更新: 使用 Boost Assign 作为@Evgeny Panasyuk 的回答表明它应该是这样的:

    EXPECT_EQ(mock->params,list_of("firstCall")("secondCall"));
    

    如果我理解正确(从答案中看不太清楚,而且我个人从未使用过这个)。

    【讨论】:

      【解决方案3】:

      您可以使用Google Mock(Google Mock 是 Google Test 的配套模拟框架)丰富的匹配器库来编写外观清晰的测试断言:

      #include <gtest.h>
      #include <gmock.h>
      
      using testing::ElementsAre;
      
      TEST(Foo, Bar) {
        EXPECT_THAT(mock->params, ElementsAre("firstCall", "secondCall"));
      }
      

      当测试条件被违反时,该断言也会产生明确的信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-10
        • 1970-01-01
        • 1970-01-01
        • 2014-05-23
        • 2017-04-30
        • 2011-01-21
        • 2017-07-20
        • 1970-01-01
        相关资源
        最近更新 更多