来自 gmock 的 DefaultValue 的范围问题

scope issue with DefaultValue from gmock

如果我把 DefaultValue<int>::Set(10) 放在 TEST 中,一切正常,但是,如果我把它放在外面,它会报错。怎么了?根本原因?

using ::testing::DefaultValue;
struct Foo {
  MOCK_METHOD0(doWork, int());
};

DefaultValue<int>::Set(10); // error: specializing member 'testing::DefaultValue<int>::Set' requires 'template<>' syntax;

TEST(BarTest, DoesThis) {
  Foo foo;
  DefaultValue<int>::Set(10); // everything works fine.
  EXPECT_CALL(foo, doWork());
  foo.doWork();
}

DefaultValue<int>::Set(10) 是函数调用。它是一个语句,一般来说,语句不能在命名空间范围内单独出现。

将它放在函数的范围内是可以的,这就是它起作用的原因。尽管您可能想要重构它,以便它在您测试套件之前只运行一次(毕竟,这就是具有全局默认值的意义所在)。

将它放在任何函数之外时出现的错误只是由于编译器的混淆。由于看起来就像您正在尝试特化 DefaultValue<int> 的成员函数,编译器不知道您的意图是做一些无法完成的事情。因此,诊断的措辞旨在帮助您做正确的事情,如果您在专业化过程中犯了一个诚实的错误。