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