Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHPUnit测试调用同一类的其他方法但不返回值的方法_Php_Unit Testing_Testing_Phpunit - Fatal编程技术网

如何使用PHPUnit测试调用同一类的其他方法但不返回值的方法

如何使用PHPUnit测试调用同一类的其他方法但不返回值的方法,php,unit-testing,testing,phpunit,Php,Unit Testing,Testing,Phpunit,如何为调用同一类的其他方法但不返回值的方法编写单元测试?(比如说PHPUnit。) 例如,假设我有以下课程: class MyClass { public function doEverything() { $this->doA(); $this->doB(); $this->doC(); } public function doA() { // do something, retu

如何为调用同一类的其他方法但不返回值的方法编写单元测试?(比如说PHPUnit。)

例如,假设我有以下课程:

class MyClass {

    public function doEverything() {

        $this->doA();
        $this->doB();
        $this->doC();

    }

    public function doA() {
        // do something, return nothing
    }

    public function doB() {
        // do something, return nothing
    }

    public function doC() {
        // do something, return nothing
    }

}
您将如何测试
doEverything()

编辑:

我这样问是因为从我所读到的内容来看,几乎每个方法都应该有自己的专用单元测试。当然,您也有功能测试和集成测试,但可以说,这些测试的目标是特定的例程(不一定是每个方法级别)


但是,如果几乎每个方法都需要自己的单元测试,我认为对上述所有方法进行单元测试将是“最佳实践”。是/否?

好的!我已经弄明白了!正如所料,模拟是我在这种情况下所需要的——模拟兄弟方法被称为部分模拟。这里面有一些关于PHPUnit嘲笑的非常好的信息

因此,要在上述类中测试
doEverything()
,我需要执行以下操作:

public function testDoEverything()
{

    // Any methods not specified in setMethods will execute perfectly normally,
    // and any methods that ARE specified return null (or whatever you specify)
    $mock = $this->getMockBuilder('\MyClass')
        ->setMethods(array('doA', 'doB', 'doC'))
        ->getMock();

    // doA() should be called once
    $mock->expects($this->once())
         ->method('doA');

    // doB() should be called once
    $mock->expects($this->once())
         ->method('doB');

    // doC() should be called once
    $mock->expects($this->once())
         ->method('doC');

    // Call doEverything and see if it calls the functions like our
    // above written expectations specify
    $mock->doEverything();
}
就这样!很简单

奖励:如果你使用Laravel和Codeception。。。 我使用的是Laravel框架和Codeception,这使得解决这个问题有点困难。如果您使用Laravel和Codeception,您需要做更多的工作才能使其正常工作,因为Laravel自动加载默认情况下不会连接到PHPUnit测试。您基本上需要更新
unit.suite.yml
以包含Laravel4,如下所示:

# Codeception Test Suite Configuration

# suite for unit (internal) tests.
class_name: UnitTester
modules:
    enabled: [Asserts, UnitHelper, Laravel4]
更新文件后,不要忘记调用
php codecept.phar build
来更新配置。

虽然模拟测试确实达到了目标,但我认为您对代码的信心有所下降。将原始的琐碎方法与测试它的复杂方法进行比较。被测试方法失败的唯一方法是忘记添加一个方法调用或错误键入名称。但是现在,您使用所有这些额外的代码来实现这一点的可能性加倍,而且它没有任何测试

规则:如果您的测试代码比正在测试的代码更复杂,它需要自己的测试

鉴于上述情况,最好找到另一种方法来测试原始代码。对于编写的方法——三个没有参数的方法调用——肉眼检查就足够了。但是我怀疑这个方法确实有一些副作用,否则你可以删除它


单元测试是将类作为一个单元进行测试,而不是单独测试每个方法。单独测试每个方法可以很好地表明您是在代码之后编写测试的。首先使用和编写测试将有助于您设计一个更易于测试的更好的类。

此时是否会考虑单元测试?有人可能会说,单元测试不如其他类型的测试重要,比如集成测试,在给定的场景中,您可能更擅长测试集成测试。听起来不错!与功能/集成和验收测试相比,是否有编写单元测试的经验法则?我的印象是,几乎每种方法都应该有自己的单元测试与之关联,而不管它们是否也被更广泛的功能/集成测试和/或验收测试所涵盖。你应该有4个单元测试。很漂亮,谢谢。虽然你发布的帖子确实很有帮助,但我不认为有这个帖子有什么坏处,它特别显示了PHPUnit语法来完成我想要的?(假设我或其他人可以解决:-)如果需要在其中一个方法中返回值,您会怎么做?例如:doA返回$this->doD()@Lucas,您可以添加
->andReturns($mock->doB())