您能检查在PHPUnit中不使用getMock调用函数的次数吗

您能检查在PHPUnit中不使用getMock调用函数的次数吗,php,phpunit,Php,Phpunit,我的测试套件调用对象A中的accepted。然后该函数将调用对象B的insert一定次数,具体取决于我正在运行的测试 我想验证在每个测试中调用insert的次数是否正确。我不认为我可以使用mock计算它,因为对象A在我的测试中不会碰到mock 我在两年前看到这个问题: 使用全局变量进行计数并不理想,因为我的类中不应该有专门用于类的代码 编辑 请注意,insert是静态的,这可能会有所帮助。即使我模拟该类并指定我只想模拟该函数,它仍然会对模拟对象调用new,这是我面临的另一个障碍 回答 答案是否

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

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

我在两年前看到这个问题:

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

编辑

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

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

我最终发现我只能使用一个对象,但却遇到了另一个障碍:
在这种特殊情况下,这似乎是不可能的

但在某些特定情况下,您可以模拟静态方法:

测试:

结果:

$ 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.
$phpunit——过滤QQQ
塞巴斯蒂安·伯格曼的PHPUnit 3.6.10。
从/var/www/../phpunit.xml读取配置
F
时间:1秒,内存:10.75Mb
有1次失败:
1) …::testQQQ
调用2次时,方法名称等于的预期失败。
方法预期被调用2次,实际调用1次。
失败!
测试:1,断言:2,失败:1。

您可以使用它动态地重新定义静态方法(不过,您可能不应该这样做)。除此之外,您还必须重新构造代码。要么使用非静态调用和依赖项注入(这样对象A从外部源接收对象B,而您的测试可以通过模拟),要么使用依赖项注入容器,这样类名就不会连接进来,您的测试就可以创建一个模拟子类并让类A使用它(这比较混乱,但需要在非测试代码中进行的更改要少得多,因为您可以让方法保持静态)。

现在您了解了为什么静态是邪恶的:-)在研究这一点时,我看到了一些对静态方法的憎恨。创建一个空对象然后对其调用instance方法是正确的吗?这是我刚刚阅读的文章,它抨击静态:)当我模拟静态函数时,它仍然在对我的对象调用new。而且,即使我模拟静态函数,我认为我的其他对象也无法访问该函数。我的另一个对象没有对
$class
@Dave Stein的引用:我不确定我是否理解这种情况。您说过需要统计静态方法的调用数。这里是“我的另一个对象不会引用$class”——它不应该这样做。你建立了一个模拟考试的方法我不擅长解释所以谢谢你和我在一起。我的测试是针对对象B的。我调用对象a中的一个方法,该方法调用对象B中的静态方法。静态方法只是基于对象a中的信息填充一个表。因此,我的测试是调用对象a的方法,该方法调用B。然后我验证B的最后一行是否正确。我还想验证该方法是否只被调用过一次。@Dave Stein:因此,上面的示例看起来与您刚才解释的类似我在几篇文章中听到的runkit,而且它似乎是不应该使用的(即使您说不要同时使用它)。我能够重组代码,但仍然遇到一些我在这里要问的障碍:
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.