【问题标题】:Testing API keys on initialization在初始化时测试 API 密钥
【发布时间】:2014-04-11 20:37:54
【问题描述】:

<?php 

class api
{
    private $key;
    private $secret;

    public function __construct($key, $secret)
    {
        $this->key = $key;
        $this->secret = $secret;
    }
}

测试

public function test_api_keys_are_set_on_initialization()
{
    $this->assertNotEmpty($this->api->key);
    $this->assertNotEmpty($this->api->secret);
}

显然,PHPunit 不会让您测试私有变量。但是如何编写一个测试来检查是否在__construct() 中设置了密钥?

【问题讨论】:

标签: php testing phpunit


【解决方案1】:

您显示的代码实际上没有意义。您要测试的类无法让外部世界恢复这些私有属性,因此目前在生产代码中根本没有该类的用例。

但我认为该类确实包含至少一种方法,该方法确实使用这两个信息对某个地方进行 API 调用。您将测试传递给构造函数的字符串是否显示在此调用中,因为它们是否存储在私有属性中无关紧要,它们必须存在于 API 调用中。

为了测试这一点,你进入了嘲笑的世界。在您的api 类中应该有一个进行实际通信的对象。这个对象会得到一个带有这些秘密字符串的方法调用。您应该配置一个模拟对象来检查这些字符串是否正确传递。

如果这样做,您可以重构与存储这些字符串相关的任何内容。您可以重命名变量,可以将它们移动到其他对象中 - 一切皆有可能,您的测试仍然保持绿色,因为它们不测试您的类的内部结构,只测试来自外部的可观察行为。外界只关心这个。

但是,如果您真的想测试私有属性:使用反射使它们在您的测试中可访问。或者编写一个 getter 方法来读取它们。

【讨论】:

  • 如果您真的想测试私有方法和变量,您还可以添加反射以确保正确设置内部私有变量。我使用反射来确保我们的 API 的私有内部和访问它们的函数不会更改参数顺序或值,而不会更新测试。提供一些回归保证。
  • 其实你并不想测试内部结构。将私有属性从 key 重命名为 hash 应该是有效的更改,如果有人认为这是存储内容的更合适的名称,并且此重命名不应破坏任何测试,也不强制需要更改测试现在检查不同的内部变量。我知道经验不足的开发人员会尝试研究他们的类的内部结构,我认为为了变得更好而采取这一步是可以的。并且可能还有其他无法测试的代码。仍然应该避免。
【解决方案2】:

这很难简洁地回答,但这位用户做得更好:https://stackoverflow.com/a/8929561/290293

【讨论】:

  • 是的,我已经找到了。而且我知道您不这样做(出于某种原因,它是私人的)。但是对于我的用例,我该如何解决这个问题?
猜你喜欢
  • 1970-01-01
  • 2018-06-23
  • 2020-12-31
  • 1970-01-01
  • 2012-04-28
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
相关资源
最近更新 更多