系统信息:OS X 10.10.5,Clang = Apple LLVM版本6.1.0(clang-602.0.53)(基于LLVM 3.6.0svn),cmake = 2.8.12.2
假设我有一些简单的文件main.cpp:
#include <stdio.h>
#include <vector>
#include <algorithm>
int main(void)
{
std::vector<int> v{1, 2, 3, 4};
int sum = std::accumulate(v.begin(), v.end(), 0);
printf("Sum = %d\n", sum);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行"clang ++ -stdlib = libc ++ -std = c ++ 11 main.cpp"时,我收到错误:
main.cpp:11:20:错误:命名空间'std'中没有名为'accumulate'的成员int sum = std :: accumulate(v.begin(),v.end(),0);
当我看,使用IDE(Qt Creator),我看到包含的头是/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/algorithm
当我查看我的文件系统时,我发现/usr/include/c++/4.2.1存在符合c ++ 11标准的文件.
接下来,我使用cmake来控制更大的构建(上面只是一个示例设置).
所以这是上面例子的标记CMakeLists.txt文件:
project(c11Test)
cmake_minimum_required(VERSION 2.8)
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_CXX_FLAGS "-stdlib=libc++ -std=gnu++11")
add_executable(${PROJECT_NAME} main.cpp)
Run Code Online (Sandbox Code Playgroud)
在我构建时,创建此输出(摘录):
[100%]构建CXX对象CMakeFiles/c11Test.dir/main.cpp.o/usr/bin/c ++ -stdlib = libc ++ -std …
有人建议我使用指针添加一个我想从一些现有函数传递给另一个函数的向量.我真的很困惑如何从该指针中获取信息.我已经尝试了很多我在这里和那里读过的东西,所以让我展示一下我在说什么.
主要课程:
std::vector<float> * dvertex=NULL;
track.calculate(irrelevant stuff, dvertex)
Run Code Online (Sandbox Code Playgroud)
二级程序(跟踪,计算)
track::caclulate(irrelevant stuff, vector<float> * dvertex)
{
...
vector<float> pos;
... pos filled after some calculations
if(! (dvertex==NULL))
{
dvertex = &pos1;
}
Run Code Online (Sandbox Code Playgroud)
回到小学,除非我弄乱了上面的东西,这里有一些我尝试过的东西
1
(*dvertex).at(0)
float z = (*dvertex).at(0)
Run Code Online (Sandbox Code Playgroud)
2
(*dvertex)[0]
Run Code Online (Sandbox Code Playgroud)
和一堆简单的东西没有编译.由于我不确定如何在主程序中从该向量中获取特定值,所以我很困惑.我甚至认为它可能是if(!(dvertex == NULL))位,因此我将其更改为if(dvertex == NULL)但仍然没有快乐.任何帮助将不胜感激.
*编辑/更新*非常感谢大家的帮助,但我担心我仍然做错了.
所以按照我刚刚传递参考的建议:我这样做了:
主
std::vector<float> dvertex;
track.calculate( foo, &dvertex);
Run Code Online (Sandbox Code Playgroud)
二级保持不变(有!空检查)
主
std::cout<<dvertex[0]<<std:endl;
Run Code Online (Sandbox Code Playgroud)
(以及实际使用数据的其他尝试)
非常感谢您对我仍然做得不正确的想法.一切都编译好,当程序达到使用dvertex数据的程度时,程序就会冻结.
编辑:最终修复
在我需要的二级课程中
*dvertex = pos1;
Run Code Online (Sandbox Code Playgroud)
代替
dvertex = &pos1;
Run Code Online (Sandbox Code Playgroud) 有一个工具可以生成客户端存根的模拟版本,这非常有帮助。测试服务器端目前让我非常头痛。我已经够头痛了,我觉得我一定是做了一些根本性错误的事情。
我可能误读了以下内容,但端到端测试(包括“mock_test”)似乎正在使用实际的客户端-服务器连接来驱动测试。他们可能会模拟客户端,或者模拟客户端读取器/写入器以查看服务器的响应,但我不清楚如何单独测试服务器。
我想要做的事情:我有一些继承自 gRPC 生成的类“Service”的服务实现。假设服务公开了一个接口,::grpc::Status Foo(::grpc::ServerContext* context, const CommandMessage* request, ::grpc::ServerWriter<CommandResponse>* writer);我编写单元测试的直觉是传递一个模拟“ServerWriter”类,并期望在适当的时候调用“Write”。但 ServerWriter 被标记为最终的并且不能被覆盖。
这并不是我第一次在我的标准模拟方法和 gRPC 服务器内容方面遇到麻烦。我已经包装了 Server 类、ServerBuilder 类等,以便我可以将它们的模拟版本放入测试中(以验证在构建服务器时是否将正确的参数传递给我的服务器,例如)
所以我想我错过了 grpc 的一些东西。我只是不知道是什么。我是否应该在单元测试中建立一个真实的服务器并使用模拟客户端对其进行探测?如果我必须使用测试配置来支持测试版本,如何验证是否通过了正确的服务器配置?该代码具有接口类和虚拟方法,但是似乎公开供公众使用的部分似乎并不像我期望的那样容易被模拟。
我在单元测试期间遇到一些情况,我希望某些QTimer的超时在某个QObject中触发一些插槽.如何做到这一点以及此测试的一些常见缺陷并不是很明显.
c++ ×4
googletest ×2
c++11 ×1
clang ×1
cmake ×1
googlemock ×1
grpc ×1
macos ×1
pointers ×1
qt ×1
qtimer ×1
unit-testing ×1
vector ×1