【问题标题】:Unit Tests - can / should I use setUp and tearDown, when my instantiation varies?单元测试 - 当我的实例化发生变化时,我可以/应该使用 setUp 和 tearDown 吗?
【发布时间】:2014-06-11 06:59:03
【问题描述】:

假设我有一个在构造函数中使用参数的类,例如:

$var = new MyClass(1, 2, 3);

我的各种测试取决于传递给类的参数。

我注意到 PHPUnit 有 setUp() 和 tearDown() 方法,可以用来实例化一个类,通常是在构造函数没有参数的情况下,在执行每个测试之前。

有没有办法在我的测试工具中使用 setUptearDown 方法来处理我的示例中的类,或者我是否只是像我一直在做的那样在每个测试中单独实例化我的类?

p>

我问这个问题更多是为了检查我没有错过任何关于如何正确使用 setUptearDown 的内容。

【问题讨论】:

    标签: unit-testing tdd phpunit


    【解决方案1】:

    我同意 inf3rno 的回答:如果构造函数需要参数,则不应使用 setUp。

    也许您可以利用另一个功能:dataProviders。它们允许您为同一个测试定义多个数据集:

    public function sumExamples()
    {
        return array(
           array(1, 2, 3),
           array(1, -1, 0),
           array(-1, -2, -3)
        );
    }
    
    /**
     * @dataProvider sumExamples
     */
    public function testSum($a, $b, $expected_result)
    {
        $instance = new Sum(1, 2);
        $this->assertEquals($expected_result, $sum->getValue());
    }
    

    PHPUnit docs on this

    当然,只有当所有数据集的断言都相同时,这种技术才有用。

    最后,如果构造函数参数对于对象的工作是必需的,我会将它们保留在原处。摆脱它们只是为了在 setUp 实例化对象是不正确的 IMO。

    【讨论】:

    • 是的,数据集也很好;-)
    【解决方案2】:

    我的各种测试取决于传递给 类。

    如果测试依赖于构造函数参数,你不能使用 setUp 来创建实例......设置是重复的事情......尽量避免构造函数注入,所以你可以使用这样的东西:

    protected $instance;
    public function setUp(){
        $this->instance = new MyClass();
    }
    
    public function testSomething(){
        $this->instance->setParams(1,2,3);
        //...
        $this->assertEquals(...);
    }
    
    public function testSomethingElse(){
        $this->instance->setFirstParam(1);
        $this->instance->setSecondParam(2);
        $this->instance->setThirdParam(3);
        //...
        $this->assertEquals(...);
    }
    

    办公室。这取决于你的班级做什么......

    【讨论】:

    • 谢谢……这让我走上了……我想避免构造函数注入还是想使用它。这是一个更深层次的话题。想了想,想避免setter调用不正确的情况,所以在构造函数中放入参数。
    【解决方案3】:

    setUptearDown 这两种方法大多是按约定的。如果需要,您可以使用它们,但不能使用。

    例如如果你有一个私有的辅助方法来帮助你创建被测主题的实例,那就太好了。您也可以使用setUp 为这些创建工厂。做有助于保持测试代码小而简单的事情。

    由于您没有共享任何测试代码,我无法给出更具体的建议。

    继续阅读:xUnit (Wikipedia)Implicit Setup (xUnit Pattern)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-05
      • 1970-01-01
      • 2015-06-15
      • 2017-04-24
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      相关资源
      最近更新 更多