对于PHPUnit,`expect_any_instance_of`等效

时间:2017-06-13 15:59:20

标签: php unit-testing rspec phpunit

我是一名探索PHP和PHPUnit的rails程序员。从RSpec切换到PHPUnit,我一直在苦苦挣扎。

更具体地说,RSpec有一个非常好的存根方法,叫做expect_any_instance_of,允许你存根任何类的任何实例。

我很难在PHPUnit中找到相应的东西。

这是我在代码中的场景:

Error in `[.data.frame`(x, order(x, na.last = na.last, decreasing = decreasing)) : 
  undefined columns selected

我想存根<?php use PHPUnit\Framework\TestCase; class SomeClass { public function testMethod() { $api_interface = new RemoteAPIClassObject(); $result = $api_interface->makeCall() $this->assertEquals('foo', $result->api_response); } } ?> 实例中的方法makeCall。有没有办法在PHPUnit中这样做,所以每次运行我的测试套件时,我实际上都不必对远程服务器进行远程API调用?

我已经阅读了有关PHPUnit test doubles and class mocks但是好像所有PHPUnit存根/模拟方法都返回了一个不是我想要的存根实例,因为我试图存根的方法是调用堆栈的下游。 / p>

在rspec中,我只是使用前面提到的方法来存根调用:

RemoteAPIClassObject

也许我的策略已经结束,我需要重新考虑我的考试?

1 个答案:

答案 0 :(得分:1)

您将创建一个类的模拟对象并使用它。

$api_interface = $this->getMockBuilder('RemoteAPIClassObject')
    ->setMethods(['makeCall'])
    ->getMock();

$api_interface->expects($this->once())
    ->method('makeCall')
    ->willReturn((object)['api_response' => 'foo']);

这样做并不是一个好习惯。我们正在嘲笑我们要测试的课程。最好允许您正在测试的类接收模拟连接,我们可以将其传递给RemoteAPIClassObject并将其存根以进行响应。这将允许您的代码不必实际进行远程api调用,并允许您可以灵活地进行连接。

如果没有详细了解您正在测试的对象,我无法提供更多详细信息。