5

我正在编写一个与 API 接口的perl模块,我想在将它放在CPAN上之前为它编写一个测试套件。然而,因为这个模块基本上只是一个 API 的接口,所以所有的测试都需要一个有效的 API 密钥和用户。显然,我无法在测试套件中使用我的 API 密钥和用户名发布此模块,那么处理此类事情的最佳方法是什么?我应该只在本地进行测试,然后在没有测试的情况下将其放在 CPAN 上吗?有没有人遇到过这个问题并想出一个好的解决方案?我知道编写测试是最佳实践,所以如果可以的话,我想这样做。谢谢!

4

3 回答 3

4

为什么不将 API 调用封装到小函数中(例如,该函数除了 API 调用之外什么都不做),然后根据需要使用Test::MockObject或类似方法在您的测试中模拟这些函数?

这会更好,因为您将能够进行测试来测试来自 API 的不同结果(失败、身份验证失败等......)

于 2013-07-09T21:17:07.570 回答
3

我在我的文档中明确表示,如果没有 API 密钥,我的模块将毫无用处,并且如果密钥不存在,则使用 Test::More 的 skip:{} 构造来跳过所有测试。您也可以选择 bail_out 而不是 skip。

只要确保您的文档解释了如何将 API 密钥传递给模块。

于 2013-07-09T21:12:57.600 回答
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环境变量中指定的主机(或本地主机)。如果不能,它会跳过所有测试并告诉原因。跳过仍然算作非失败,因此如果没有可用的测试服务器,它不会阻止模块的安装。

use在发行版中的每个 .t 文件中都有一个 .pm 文件中的代码。

于 2013-07-09T21:20:48.427 回答