我正在编写一个与API接口的perl模块,我想在将它放到CPAN之前为它编写测试套件。但是,由于此模块基本上只是API的接口,因此所有测试都需要有效的API密钥和用户。显然我无法在测试套件中使用我的API密钥和用户名发布此模块,那么处理这样的事情的最佳方法是什么?我应该只在本地进行测试,然后在没有测试的情况下将其放在CPAN上吗?有没有人遇到过这个并想出一个好的解决方案?我知道编写测试是最佳实践,所以如果可以,我想做。谢谢!
答案 0 :(得分:4)
为什么不将API调用包装成小函数(例如函数没有,但API调用),然后根据需要使用Test::MockObject
或类似函数在测试中模拟这些函数?
这样会更好,因为您可以使用测试来测试API的不同结果(失败,身份验证失败等等)
答案 1 :(得分:3)
我在我的文档中明确表示,如果没有API密钥,我的模块就没用了,并且如果密钥不存在,则使用跳过:{}构造Test :: More来跳过所有测试。你可以选择太bail_out而不是跳过。
确保您的文档解释了如何将API密钥传递给模块。
答案 2 :(得分:2)
我处理此类事情的常用方法是需要一个环境变量才能运行测试套件。环境变量将包含有用的信息(例如API密钥,要连接的主机名等)。
这是一个如何在测试文件中处理此类事情的示例。我们将此用于MongoDB分发,以检查是否有可用的服务器运行:
BEGIN {
eval {
my $host = exists $ENV{MONGOD} ? $ENV{MONGOD} : 'localhost';
$conn = MongoDB::MongoClient->new( host => $host, ssl => $ENV{MONGO_SSL} );
};
if ( $@ ) {
plan skip_all => $@;
exit 0;
}
};
所有这一切都是尝试连接到MONGOD
环境变量(或其他localhost)中指定的主机。如果不能,它会跳过所有测试并说明原因。跳过仍然算作非故障,因此如果没有可用的测试服务器,它将不会阻止模块的安装。
我在.pm文件中有这个代码,我在发行版的每个.t文件中use
。