【问题标题】:Does mocking affect your assertion count?模拟会影响您的断言计数吗?
【发布时间】:2011-08-01 21:52:01
【问题描述】:

我注意到,当我使用模拟对象时,PHPUnit 会正确报告执行的测试数量,但会错误地报告我所做的断言数量。事实上,每次我嘲笑它都算作另一个断言。一个包含 6 个测试、7 个断言语句的测试文件,每个测试模拟一次报告 6 个测试、13 个断言。

这是一个测试文件,除一个测试外,其他所有测试都被删除(此处用于说明),另外我介绍了另一个不存根的测试来追踪此问题。 PHPUnit 报告 2 个测试,3 个断言。我删除了虚拟对象:1 个测试,2 个断言。

require_once '..\src\AntProxy.php';

class AntProxyTest extends PHPUnit_Framework_TestCase {
    const sample_client_id = '495d179b94879240799f69e9fc868234';    
    const timezone = 'Australia/Sydney';
    const stubbed_ant = "stubbed ant";
    const date_format = "Y";

    public function testBlankCategoryIfNoCacheExists() {
        $cat = '';
        $cache_filename = $cat.'.xml';
        if (file_exists($cache_filename))
            unlink($cache_filename);

        $stub = $this->stub_Freshant($cat);

        $expected_output = self::stubbed_ant;
        $actual_output = $stub->getant();
        $this->assertEquals($expected_output, $actual_output);
    }

    public function testDummyWithoutStubbing() {
        $nostub = new AntProxy(self::sample_client_id, '', self::timezone, self::date_format);
        $this->assertTrue(true);
    }    

    private function stub_FreshAnt($cat) {
        $stub = $this->getMockBuilder('AntProxy')
                     ->setMethods(array('getFreshAnt'))
                     ->setConstructorArgs(array(self::sample_client_id, $cat, self::timezone, self::date_format))
                     ->getMock();

        $stub->expects($this->any())
             ->method('getFreshAnt')
             ->will($this->returnValue(self::stubbed_ant));

        return $stub;
    }
}

就像在框架的一个模拟方法中留下了一个断言。有没有办法显示每个(通过)断言?

【问题讨论】:

    标签: phpunit


    【解决方案1】:

    每个测试方法完成后,PHPUnit 会在测试期间验证模拟期望设置。 PHPUnit_Framework_TestCase::verifyMockObjects() 增加每个创建的模拟对象的断言数。如果您确实需要,可以通过存储当前断言数、调用父方法并减去差值来覆盖该方法以撤消此操作。

    protected function verifyMockObjects()
    {
        $count = $this->getNumAssertions();
        parent::verifyMockObjects();
        $this->addToAssertionCount($count - $this->getNumAssertions());
    }
    

    当然,verifyMockObjects() 会在任何期望不满足时抛出一个断言失败异常,所以你需要在重置计数后捕获异常并重新抛出它。我会把它留给你。 :)

    【讨论】:

    • 所以我看到的行为是故意的。 verifyMockObjects() 必须有充分的理由增加断言计数器,所以我不会覆盖它。我会忍受它,我也不希望乱扔垃圾甚至测试代码和变通方法。也许除了我以外的每个人都明白为什么会这样,但我很惊讶我在任何地方都找不到它。
    • 当你在测试中使用 mocks 是有意义的:“调用 X 会导致它在 mock 上调用 Y。如果没有,测试就被破坏了。”但是当你使用模拟作为存根来简化测试时,它只是噪音:“调用 X 将需要调用 Y,但它只需要 false 所以返回它。”最后,我不会将断言的数量用于任何事情,所以没关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多