我刚刚发现了gmock,现在正在"重新思考整个编程过程",尽可能地添加单元测试.令我感到奇怪的一点是,QSql模块明显是我们代码的外部依赖,并没有给开发人员提供模拟其内部的工具.我能用这个模块想到的最好的东西是内存数据库,它比简单的模拟更难实现,甚至不可能(考虑使用内存数据库伪装oracle包)
现在,对我来说,这不是一个问题,不久之前我们已经切换到继承自虚拟接口的本地增长的ocilib包装器(因此,很容易模拟).但是真的,当你使用Qt自己的QSql模块时,有没有办法模拟?或者更确切地说 - Qt是一个(非常好的)框架,他们真的没有为这些用例提供自动化,或者我错过了什么?
UPD1:关于问题重要性的小更新:
我的代码非常与Oracle SQL查询交错,因为对于某些其他人的代码而言.当外部依赖(也是大量开发)有时会提供不正确的数据时,单元测试这样的代码实际上是不可能的.当您的单元测试中断时,您希望它是您的代码,而不是Oracle.这就是我问原问题的原因.如果存在/存在一种使用qsqlquery接口半容易地模拟依赖关系的方法,则可以使用QSql编写代码的单元测试.
UPD2:虽然经过进一步考虑后,我不得不承认,通过更好的代码设计(OO而不是某些地方的免费功能)和更好的实体分离可以避免这个问题.因此,在UPD1中几乎不可能是不合理的.虽然这并没有真正使原始问题变得不那么重要.例如,当你负责维护遗留代码时,模拟QtSql是将测试引入系统的唯一现实方法.
我刚刚了解了std :: function到底是什么以及它用于什么,我有一个问题:现在我们基本上有代理,我们应该在何时何地使用抽象基类,何时我们应该实现多态性通过std :: function对象提供给泛型类?ABC在C++ 11中受到了致命打击吗?
就个人而言,到目前为止,我的经验是切换委托代码比为特定行为创建多个继承类要简单得多......所以我有点困惑abotu从现在起如何有用的Abstract Bases.
我们在C++ 11中获得的新auto关键字对我来说看起来非常模糊,所以我的问题是 - 它会像模板那样产生相同的编译时间吗?
关于多态lambda的同样问题:
[](auto val) {...}
Run Code Online (Sandbox Code Playgroud)
这本质上是一个模板lambda - 这会影响编译时间吗?
我不知道是否可能,但我想做的事情
int someval = 1;
if({1,2,3,4}_v.contains(someval ))
Run Code Online (Sandbox Code Playgroud)
但是当我尝试将文字定义为:
std::vector<int> operator"" _v ( std::initializer_list<int> t )
{
return std::vector<int> (t);
}
Run Code Online (Sandbox Code Playgroud)
接受我得到的初始化列表
error: 'std::vector<int> operator"" _v(std::initializer_list<int> t)' has invalid argument list
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?我真正想要的是最终摆脱像这样的东西
if(value == 1 || value ==2 || value == 3 ...
Run Code Online (Sandbox Code Playgroud)
写这样的东西真的很烦人,因为你期望语法
if value in (value1, value2 ...)
Run Code Online (Sandbox Code Playgroud)
或类似的东西.
我试图将文件从另一台计算机拉到Centos 6上的RStudio的R环境中
我先在普通R中尝试过,当我发行时
readLines(pipe( 'ssh root@X.X.X.X "cat /path/somefile.sh"' ))
Run Code Online (Sandbox Code Playgroud)
它正确地要求我输入我的ssh密码并读取内容.
但是,如果从RStudio执行相同的命令,我得到的是:
ssh_askpass: exec(rpostback-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(rpostback-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(rpostback-askpass): No such file or dire
Permission denied (publickey,gssapi-with-mic,password).
Run Code Online (Sandbox Code Playgroud)
我怀疑原因是因为rstudio on centos实际上使用了rstudio-server用户(并且gui是在浏览器中提供的).有谁知道如何从中正确访问ssh'd资源?
UPD:执行后
Sys.setenv(PATH = paste0(Sys.getenv('PATH'), ':/usr/lib/rstudio-server/bin/postback'))
Run Code Online (Sandbox Code Playgroud)
如下所示,它不会输出askpass错误,但它仍然无法正常工作.现在看来控制台正在等待命令无限期地执行
刚开始学习R,我立刻感到困惑:
鉴于每个人(在SO上)一直认为传值是主要的R范例之一,是否有可能有效地实现暗示"就地修改"的算法(又名快速排序等)?我看到它的方式 - 如果我使用RI执行此操作将必须返回中间结果有效复制在另一种语言中我将修改由指针/引用传递的数组.我错过了什么吗?
我明白这可能是错误的语言,但它真的如此吗?
我有自己的QAbstractTableModel子类.当新数据插入其中时 - 我发出beginInsertRows/endInsertRows,然后发出带正确索引的dataChanged.rowCount似乎被改变了,因为我看到滚动条出现并增长,但.... columnCount不是.
顺序是这样的:
1)在将模型插入tableview之前填充模型.这种方式可以捕获适当数量的列.
2)我先将模型插入视图,然后用数据填充它.在这种情况下,即使在发出dataChanged之后,视图也不会显示任何内容,因为它似乎仍然认为没有列.(coulmnCount()返回适当的金额 - 我检查了几次)
从我在Qt文档中看到的内容看起来我不需要为大多数模型手动调用beginInsertColumns ...为什么当模型接收数据时视图无法选择列数?
PS在填充模型后调用第二种情况:
view->setModel(0);
view->setModel(model);
Run Code Online (Sandbox Code Playgroud)
将列数设置为适当的值,但这很丑陋......
UPD:我发现了那个发射
emit headerDataChanged(Qt::Horizontal, 0 , columnCount());
Run Code Online (Sandbox Code Playgroud)
确实修复了列问题,但文档说我不应该........ :)
I have a weird problem trying to deserialize a pointer to a derived class with boost serialize. I have a base and derived with save/load function outside them (non intrusive version) but each time I try to deserialize a pointer I get either "Input Stream Error" exception or "Unregistered class" exception. Here is what I do:
First I define my classes:
#include <fstream>
#include <iomanip>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/archive_exception.hpp>
#include "boost/serialization/split_free.hpp"
#include "boost/serialization/export.hpp"
#include "boost/serialization/utility.hpp"
#include <boost/serialization/string.hpp>
#include …Run Code Online (Sandbox Code Playgroud)