0

我的测试套件调用accepted对象 A。然后,该函数将调用insert对象 B 一定次数,具体取决于我正在运行的测试。

我想验证insert在每个测试中被调用的次数是否正确。我认为我不能使用模拟来计算它,因为对象 A 在我的测试中不会碰到模拟。

我从 2 年前看到了这个问题: PHPUnit Test How Many Times A Function Is Called

使用全局变量进行计数并不理想,因为我的类中不应该有专门用于类的代码。

编辑

注意它insert是静态的可能会有所帮助。即使我模拟该类并指定我只想模拟该函数,它仍然会调用模拟new对象,这是我面临的另一个障碍。

答案 答案是否定的。我只想@zerkms 给出这个答案,因为他是帮助我的人,所以我可以接受。

我最终发现我只能使用一个对象,但确实遇到了另一个障碍: 为什么 PHPUnit 不将此函数计算为已运行?

4

2 回答 2

0

似乎在这种特殊情况下这是不可能的。

但在某些特定情况下,您可以模拟静态方法:http ://sebastian-bergmann.de/archives/883-Stubbing-and-Mocking-Static-Methods.html

class Foo
{
    public static function doSomething()
    {
        return static::helper();
    }

    public static function helper()
    {
        return 'foo';
    }
}

测试:

public function testQQQ()
{
    $class = $this->getMockClass(
        'Foo',          /* name of class to mock     */
        array('helper') /* list of methods to mock   */
    );

    $class::staticExpects($this->exactly(2))
        ->method('helper')
        ->will($this->returnValue('bar'));

    $this->assertEquals(
        'bar',
        $class::doSomething()
    );
}

结果:

$ phpunit --filter QQQ
PHPUnit 3.6.10 by Sebastian Bergmann.

Configuration read from /var/www/.../phpunit.xml

F

Time: 1 second, Memory: 10.75Mb

There was 1 failure:

1) ...::testQQQ
Expectation failed for method name is equal to <string:helper> when invoked 2 time(s).
Method was expected to be called 2 times, actually called 1 times.


FAILURES!
Tests: 1, Assertions: 2, Failures: 1.
于 2012-05-09T22:31:34.697 回答
0

您可以使用runkit 动态重新定义静态方法(但您可能不应该这样做)。除此之外,您将不得不重组代码。要么使用非静态调用和依赖注入(因此对象 A 从外部源接收对象 B,并且您的测试可以改为通过模拟)或使用依赖注入容器,以便不连接类名并且您的测试可以创建一个模拟子类并让 A 类使用它(这更混乱,但您的非测试代码需要更少的更改,因为您可以让您的方法保持静态)。

于 2012-05-10T20:38:44.777 回答