【问题标题】:Using gtest float comparison in Matcher在 Matcher 中使用 gtest 浮点比较
【发布时间】:2017-06-26 20:04:54
【问题描述】:

我喜欢为包含一些浮点值的结构编写匹配器:

struct Point3D
{
float x;
float y;
float z;
}

class Interface
{
virtual void SetPoint(Point3D point) = 0;
}

class MockInterface:
    public Interface
{
   MOCK_METHOD1(SetPoint, void(Point3D point));
}

MATCHER_P(Point3DEq, point, "Comparison of a Point3D")
{
   return point.x == arg.x && point.y == arg.y && point.z == arg.z;
}

TEST(Point3DComparison, TestIfPoint3DAreEqual)
{
   MockInterface interfaceFake;
   Point setPoint = { 1.0, 1.0, 1.0 }
   EXPECT_CALL(interfaceFake, SetPoint(Point3DEq(setPoint)).WillOnce(Return());
}

我不喜欢这个 Matcher,因为他不尊重良好的浮动比较。我想使用 gmock 或 gtest 的浮动比较来编写一个匹配器。它应该看起来和那个相似。

MATCHER_P(Point3DEq, point, "Comparison of a Point3D")
{
   return EXPECT_THAT(point.x, FloatEq(arg.x) && EXPECT_THAT(point.y, FloatEq(arg.y) && EXPECT_THAT(point.z, FloatEq(arg.z);
}

问题是 EXPECT_THAT 没有返回任何布尔值。使用 gmock 和 gtest 的功能是否有一种干净的方法来做到这一点?

【问题讨论】:

    标签: c++ unit-testing googletest gmock googlemock


    【解决方案1】:

    最好的办法是忘记MATCHER_P...

    使用 ::testing::AllOf - 并使用来自 gmock 的适当匹配器 - 就像提到的 FloatEq/DoubleEq - 请参阅:

    auto Point3DEq(Point3D const& p_expected)
    {
        using namespace testing;
        return AllOf(Field(&Point3D::x, DoubleEq(p_expected.x)),
                     Field(&Point3D::y, DoubleEq(p_expected.y)),
                     Field(&Point3D::z, DoubleEq(p_expected.z)));
    }
    

    【讨论】:

    • 你能解释一下这个例子是如何工作的吗?我无法将此功能用作 Matcher。
    • @PeterNL 使用与 MATCHER_P 定义的完全相同的方式 - 只是 EXPECT_CALL(interfaceFake, SetPoint(Point3DEq(setPoint));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 2012-08-28
    • 1970-01-01
    相关资源
    最近更新 更多