微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用带有字符串而不是宽字符串的 Visual Studio 本机 C++ 单元测试框架

如何解决使用带有字符串而不是宽字符串的 Visual Studio 本机 C++ 单元测试框架

有没有办法将 Visual Studio 原生 C++ 单元测试框架配置为使用 std::string 而不是 std::wstrings

Assert::Equal<class T>(const T & t1,const T &t2)

需要函数

template<class T> std::wstring ToSring<class T>(const T & t) /* note the wstring here */

由测试编写者为要测试的对象(类型 T)编写/专门化。我已经有这个功能了:

ostream & operator<<(ostream & o,const T & t) /* note the ostream vs wostream */

我想重用(基于第三方窄字符串库),但我没有 wostream 等价物,也不想重写。

我有哪些选择?

解决方法

如果您的类确实wostream 方法,那么您对 ​​ToString 的专业化可以简单地使用提供的宏 RETURN_WIDE_STRING

template<> static std::wstring ToString(const Foo &t) { RETURN_WIDE_STRING(t); }

但无需更改被测代码,您可以编写一个类似的宏(或函数)将 ostream 转换为 wstring 并以相同的方式使用它:

template<> static std::wstring ToString(const Foo &t) { RETURN_WIDE_FROM_NARROW(t); }

新的宏可能类似于:

#define RETURN_WIDE_FROM_NARROW(inputValue) \
        std::stringstream ss;\
        ss << inputValue;\
        auto str = ss.str();\
        std::wstringstream wss;\
        wss << std::wstring(str.begin(),str.end());\
        return wss.str();

您还可以通过使用不需要的 ToString 变体来避免整个 Assert 特化问题:

Assert::IsTrue(t1 == t2,L"Some descriptive fail message");

不过,这可能需要更多或更多的工作,具体取决于您希望在失败消息中提供多少详细信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。