在 googlemocks EXPECT_CALL 中匹配 std::wstring
Matching std::wstring in googlemocks EXPECT_CALL
我有模拟界面
// Interface
class MyInterface
{
void get(const std::wstring& param) = 0;
}
// Mock interface
class MyInterfaceMock : public MyInterface
{
MOCK_METHOD1(get, void(const std::wstring& param));
}
示例测试方法:
...
EXPECT_CALL(myInterfaceMock, L"hello");
当我编译它时 (vs2015) 我收到消息
error C2664: 'testing::internal::MockSpec...: 无法将参数 1 从 'const wchar_t [6]' 转换为 'const testing::Matcher &'
后跟消息:
原因:无法从 'const wchar_t [7]' 转换为 'const testing::Matcher'
当我使用 std::string 而不是 std::wstring 时,一切正常。有人知道为什么 std::wstring 无法匹配吗?
我猜你的意思是 EXPECT_CALL(myInterfaceMock, get(L"hello"));
你应该写 EXPECT_CALL(myInterfaceMock, get(std::wstring(L"hello")));
一切正常。
真正的问题是为什么来自 std::string
的匹配器接受 const char*
作为值。答案是——因为 google-mock 库有意支持这个——见 code:
template <>
class GTEST_API_ Matcher<std::string>
: public internal::MatcherBase<std::string> {
public:
Matcher() {}
explicit Matcher(const MatcherInterface<const std::string&>* impl)
: internal::MatcherBase<std::string>(impl) {}
explicit Matcher(const MatcherInterface<std::string>* impl)
: internal::MatcherBase<std::string>(impl) {}
template <typename M, typename = typename std::remove_reference<
M>::type::is_gtest_matcher>
Matcher(M&& m) // NOLINT
: internal::MatcherBase<std::string>(std::forward<M>(m)) {}
// Allows the user to write str instead of Eq(str) sometimes, where
// str is a string object.
Matcher(const std::string& s); // NOLINT
// Allows the user to write "foo" instead of Eq("foo") sometimes.
Matcher(const char* s); // NOLINT
};
std::wstring
没有 Matcher<T>
的等效特化。我建议你不要添加一个——因为它将来可能会改变——这是 gmock 实现细节。相反,您可能会要求 gmock 开发人员以与 string
类似的方式添加对 wstring
的支持...顺便说一句,我已经添加了 one.
我有模拟界面
// Interface
class MyInterface
{
void get(const std::wstring& param) = 0;
}
// Mock interface
class MyInterfaceMock : public MyInterface
{
MOCK_METHOD1(get, void(const std::wstring& param));
}
示例测试方法:
...
EXPECT_CALL(myInterfaceMock, L"hello");
当我编译它时 (vs2015) 我收到消息
error C2664: 'testing::internal::MockSpec...: 无法将参数 1 从 'const wchar_t [6]' 转换为 'const testing::Matcher &'
后跟消息: 原因:无法从 'const wchar_t [7]' 转换为 'const testing::Matcher'
当我使用 std::string 而不是 std::wstring 时,一切正常。有人知道为什么 std::wstring 无法匹配吗?
我猜你的意思是 EXPECT_CALL(myInterfaceMock, get(L"hello"));
你应该写 EXPECT_CALL(myInterfaceMock, get(std::wstring(L"hello")));
一切正常。
真正的问题是为什么来自 std::string
的匹配器接受 const char*
作为值。答案是——因为 google-mock 库有意支持这个——见 code:
template <>
class GTEST_API_ Matcher<std::string>
: public internal::MatcherBase<std::string> {
public:
Matcher() {}
explicit Matcher(const MatcherInterface<const std::string&>* impl)
: internal::MatcherBase<std::string>(impl) {}
explicit Matcher(const MatcherInterface<std::string>* impl)
: internal::MatcherBase<std::string>(impl) {}
template <typename M, typename = typename std::remove_reference<
M>::type::is_gtest_matcher>
Matcher(M&& m) // NOLINT
: internal::MatcherBase<std::string>(std::forward<M>(m)) {}
// Allows the user to write str instead of Eq(str) sometimes, where
// str is a string object.
Matcher(const std::string& s); // NOLINT
// Allows the user to write "foo" instead of Eq("foo") sometimes.
Matcher(const char* s); // NOLINT
};
std::wstring
没有 Matcher<T>
的等效特化。我建议你不要添加一个——因为它将来可能会改变——这是 gmock 实现细节。相反,您可能会要求 gmock 开发人员以与 string
类似的方式添加对 wstring
的支持...顺便说一句,我已经添加了 one.