How do I test features that are not in the public interface?
我正在为自己设计一个库,允许链接数据流。让我描绘一下场景:
我创建了一个SerialDatastream,它是底层,可以读取和写入COM端口。
我将指向此的指针传递给ProtocolDatastream的构造函数,该函数解释从串行数据流读取时的字节数(虽然它只知道它满足我的Datastream接口),并将它们作为协议数据单元返回。
现在让我们说我想从串口获取信息,并将其记录为字节。我在中间插入一个TeeDatastream,它从一个源读取,但输出到两个目的地:
1 2 3 | +-----> Log | Serial ----> Tee ----> Protocol |
TeeDatastream以下列方式实现:当从一个分支执行读取操作时,它将数据缓冲到成员变量中。然后,当在另一个分支上执行读操作时,它读取已经缓冲的数据。
(顺便说一句,这个工作正常)
这意味着,在每次操作之后,类必须检查是否存在从两个分支读取的数据。然后可以丢弃该数据,因此缓冲区会缩小并且不断增长。但是,对于班级的任何客户来说,这是完全不可见的。所以我的问题是:应该使用什么模式来测试实现中隐形但必要的部分?
你需要的是
对于这些新的单元测试,"隐形部分"实际上是他们必须涵盖的内容。 这不再是隐藏的功能,而是
稍后,当您确定
在单元测试中,cpp文件在本地声明一个友元类,并声明要测试的每个受保护成员函数。
1 2 3 4 5 6 7 | class BlahTestable : public Blah { public: using Blah::protectedfunction1; using Blah::protectedfunction2; etc.... }; |
然后在单元测试中做
1 2 3 4 5 6 7 8 9 10 11 | // for public members TEST_F(BlahTest, publicfunction) { Blah s; s.publicfunction(); } // for protected members TEST_F(BlahTest, protectedfunction1) { BlahTestable s; s.protectedfunction1(); } |
除非我遗漏了某些东西,否则您似乎正在寻找简单的单元测试。 此类测试允许您测试代码的公共部分和私有部分。