我正在考虑在元组/联系的情况下返回值优化,我观察到的行为并不像我预期的那样.在下面的例子中,我希望移动语义能够启动,但它有一个复制操作.以下优化的输出是:
Test duo output, non_reference tuple
Default constructor invoked
Parameter constructor invoked
Copy constructor invoked
Move Assignment operator invoked
100
Run Code Online (Sandbox Code Playgroud)
在函数内部创建元组时复制构造函数的调用似乎是不必要的.有什么办法可以删除吗?我正在使用MSVC 2012编译器.
#include <iostream>
#include <tuple>
class A
{
public:
int value;
A() : value(-1)
{
std::cout << "Default constructor invoked" << std::endl;
}
explicit A(const int v) : value(v)
{
std::cout << "Parameter constructor invoked" << std::endl;
}
A(const A& rhs)
{
value = rhs.value;
std::cout << "Copy constructor invoked" << std::endl;
}
A(const A&& rhs)
{
value = …Run Code Online (Sandbox Code Playgroud) 通过Google测试,我想指定一个测试夹具,用于不同的测试用例.fixture必须分配和释放类TheClass及其数据管理类的对象TheClassData,其中数据管理类需要数据文件的名称.
对于不同的测试,文件名应该有所不同.
我定义了以下Fixture:
class TheClassTest : public ::testing::Test {
protected:
TheClassTest(std::string filename) : datafile(filename) {}
virtual ~TheClassTest() {}
virtual void SetUp() {
data = new TheClassData(datafile);
tc = new TheClass(data);
}
virtual void TearDown() {
delete tc;
delete data;
}
std::string datafile;
TheClassData* data;
TheClass* tc;
};
Run Code Online (Sandbox Code Playgroud)
现在,不同的测试应该使用具有不同文件名的夹具.想象一下这是设置测试环境.
问题:如何从测试中指定文件名,即如何调用灯具的非默认构造函数?
我发现喜欢的东西::testing::TestWithParam<T>和TEST_P,这没有帮助,因为我不希望运行具有不同值的一个测试,但不同的测试用一个夹具.
在谷歌文档模拟说:
重要提示: Google Mock 要求在调用模拟函数之前设置期望值,否则行为是undefined。特别是,您不能将 EXPECT_CALL() 和对模拟函数的调用交织在一起。
有谁知道这个限制背后的任何细节?我有许多单元测试肯定违反了这条规则,但是似乎运行正常。
当我厌倦启动模拟器时,我收到此错误.有什么建议?
模拟器警告:
经典qemu不支持SMP.配置文件中的hw.cpu.ncore选项将被忽略.无法加载func glBindFramebuffer无法加载func glGenFramebuffers无法加载func glFramebufferTexture2D无法加载func glCheckFramebufferStatus无法加载func glDeleteFramebuffers无法加载func glIsRenderbuffer无法加载func glBindRenderbuffer无法加载func glDeleteRenderbuffers无法加载func glGenRenderbuffers无法加载func glRenderbufferStorage无法加载func glGetRenderbufferParameteriv无法加载func glFramebufferRenderbuffer
我在Windows下调试用MSVC编译的C++程序.我想研究与多线程相关的问题.所以我把ASSERT放在我的代码中,当程序到达ASSERT时,它会显示关于ASSERT(Standart [Abort],[Retry],[Ignore]窗口)的窗口,建议在调试器中暂停程序.我按[重试]按钮并暂停程序.但是当我按下按钮时,其他线程继续执行.所以问题是如何在达到某个点时立即停止程序以查看当时其他线程正在做什么?
在调用 FuncHelper 之前,我正在尝试在 .WillOnce 中进行一些睡眠。所以我需要类似于以下内容:
EXPECT_CALL(*_mock, Func(_,_,_)).Times(1)
.WillOnce(DoAll(InvokeWithoutArgs(sleep(TimeToSleep)),
Invoke(_mock, &M_MyMock::FuncHelper)));
Run Code Online (Sandbox Code Playgroud)
是否可以在 .DoAll 中使用 arg 调用 sleep()?C++98 是首选。
更新:
该解决方案基于@Smeeheey 答案并使用 C++98。
template <int N> void Sleep ()
{
sleep(N);
}
...
EXPECT_CALL(*_mock, Func(_,_,_)).Times(1)
.WillOnce(DoAll(InvokeWithoutArgs(Sleep<TimeToSleep>),
Invoke(_mock, &M_MyMock::FuncHelper)));
Run Code Online (Sandbox Code Playgroud) 我目前有一套测试,它们是测试夹具的一部分。我也想用不同的测试夹具运行相同的测试集。
如何在不实际复制粘贴测试和“手动”更改测试夹具名称的情况下执行此操作(如下所示)?
class Trivial_Test : public ::testing::Test
{
void SetUp()
{
ASSERT_TRUE(SUCCESS == init_logger());
initial_condition = 0;
}
void TearDown()
{
shutdown_logger();
}
protected:
int initial_condition;
};
class Trivial_Test_01 : public ::testing::Test
{
void SetUp()
{
ASSERT_TRUE(SUCCESS == init_logger());
initial_condition = 1;
}
void TearDown()
{
shutdown_logger();
}
protected:
int initial_condition;
};
TEST_F(Trivial_Test, valid_input_1)
{
EXPECT_TRUE(random_num()+initial_condition < 255);
}
TEST_F(Trivial_Test_01, valid_input_1)
{
EXPECT_TRUE(random_num()+initial_condition < 255);
}
Run Code Online (Sandbox Code Playgroud)
是否有关联的一个更简洁的方式valid_input_1既Trivial_Test和Trivial_Test_01?
PS - 上面显示的测试用例是一个微不足道的测试,它名义上代表了我的实际情况,但远不及我实际处理的测试用例或测试夹具的复杂性。
我有一个以下片段,我用来尝试测试如果将最大整数转换为 a 是否会发生精度损失double:
#include <cstdint>
#include <limits>
#include <iostream>
#include <iomanip>
int main () noexcept
{
uint64_t ui64{std::numeric_limits<uint64_t>::max()};
constexpr auto max_precision{std::numeric_limits<long double>::digits10 + 1};
std::cout << "ui64 " << std::setprecision(max_precision) << std::boolalpha << ui64 << "\n\n";
double f64 = static_cast<double>(ui64);
uint64_t ui64_cast_back = static_cast<uint64_t>(f64);
std::cout << "sizeof(f64): " << sizeof(double) << std::endl;
std::cout << "f64 = " << f64 << std::endl;
std::cout << "ui64_cast_back matches original value? " << (ui64_cast_back == ui64) << std::endl;
std::cout << "ui64_cast_back = …Run Code Online (Sandbox Code Playgroud) 所以基本上我正在制作一个活动应用.一切都进展顺利,但只是将活动分享到Twitter.
我已经搜索了互联网,但我得到的只是使用我不想要的Twitter原生应用程序.我想用浏览器发推文.
我已经为FB共享实现了这种方法.
任何想法都会对我有所帮助.
let content = FBSDKShareLinkContent()
content.contentURL=NSURL(string: "http://facebook.com")
content.imageURL = NSURL(string: "http://facebook.com")
content.contentTitle = "Shou 3emlin test app "
content.contentDescription = "testing testing testing"
let shareDialog = FBSDKShareDialog()
shareDialog.fromViewController = self
shareDialog.mode=FBSDKShareDialogMode.Browser
shareDialog.shareContent = content
if !shareDialog.canShow() {
shareDialog.mode=FBSDKShareDialogMode.Native
shareDialog.shareContent = content
}
if shareDialog.canShow() {
shareDialog.show()
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试在Google Mock中设置类成员函数参数值,但出现构建错误,而且我根本不了解发生了什么。有人可以解释一下吗?
函数原型为:
virtual int recv( Socket socket
, char *buffer
, int bufferLength
, int flags ) = 0;
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用以下方法进行测试:
TEST_F( IPV4SocketTests, Read_SockErr_ok )
{
Mock_SocketAdaptor *adaptor = new Mock_SocketAdaptor;
char *rcvBuffer = "testingRcvWorks";
EXPECT_CALL( *adaptor, recv( testing::_, testing::_, testing::_, testing::_ ) )
.WillRepeatedly( testing::DoAll(
testing::SetArgPointee<1>( rcvBuffer ),
testing::Return( strlen( rcvBuffer ) ) ) );
Run Code Online (Sandbox Code Playgroud)
我收到的错误是关于从std :: get进行的转换。
c++ ×8
googletest ×5
unit-testing ×5
googlemock ×3
android ×1
c++11 ×1
constructor ×1
expectations ×1
oop ×1
precision ×1
rvo ×1
sharing ×1
stdtuple ×1
swift ×1
twitter ×1
visual-c++ ×1
xcode ×1