我正在尝试创建一个使用外部C ++ API的测试环境,这样我就可以离线测试,而无需连接到实际服务。从本质上讲,我想创建自己的假服务,用于测试目的。但是,我希望能够轻松地在这两种环境之间进行更改,而无需更改大量代码。基本上,我希望能够以某种方式在测试环境中使用外部C ++ API类。我遇到的一个问题是,由于类是外部API的一部分,我无法更改它们。我只能将它们包装在我创建的其他类中。我怎样才能处理这个问题,同时能够创建一个环境,每次我想要来回切换时都不需要更改大量的代码?我在下面有一些示例代码(使用API的相关部分)。如何将这些类放在测试工具中?谢谢!
...
SessionOptions sessionOptions;
sessionOptions.setServerHost(d_host.c_str());
sessionOptions.setServerPort(d_port);
Session session(sessionOptions);
if (! session.start())
{
std::cerr <<"Failed to start session." << std::endl;
return;
}
if (! session.openService("//blp/mktdata"))
{
std::cerr <<"Failed to open //blp/mktdata" << std::endl;
return;
}
...
SubscriptionList subscriptions;
std::set<std::string>::const_iterator cItorSubscriptionStrings(m_SubscriptionStrings.begin());
for ( ; cItorSubscriptionStrings != m_SubscriptionStrings.end(); ++cItorSubscriptionStrings)
{
subscriptions.add((*cItorSubscriptionStrings).c_str(),
"LAST_PRICE,BID,ASK,TIME",
"",
CorrelationId((char*)(*cItorSubscriptionStrings).c_str()));
}
session.subscribe(subscriptions);
while (true)
{
Event event = session.nextEvent();
MessageIterator msgIter(event);
...
while (msgIter.next())
{
Message msg = msgIter.message();
if (event.eventType() == Event::SUBSCRIPTION_DATA)
{
if ((msg.hasElement("LAST_PRICE")) || ((msg.hasElement("BID")) && msg.hasElement("ASK")))
{
double mid = 0;
if ((msg.hasElement("BID")) && (msg.hasElement("ASK")))
{
mid = (msg.getElementAsFloat64("BID") + msg.getElementAsFloat64("ASK")) / 2;
}
else
{
mid = msg.getElementAsFloat64("LAST_PRICE");
}
...
}
}
}
...
}
答案 0 :(得分:0)
您可以做的一件事是使用接口(即头文件)并提供您自己的实现,至少对于您关心的那些功能。在两个版本之间切换基本上相当于连接不同的库:你的测试,他们的真实实现。
有一些问题可以解决,例如只保留公共接口并更改私有接口(在这种情况下,编译需要针对不同的声明,例如使用标题的不同搜索路径):
答案 1 :(得分:0)
您可以尝试引入一个简单的(http://www.natpryce.com/articles/000785.html)。如果给定的API不适合测试,那么在它上面引入一个新的瘦接口。