2017-06-13 81 views
0

我是一名探索PHP和PHPUnit的rails程序员。从RSpec切换到PHPUnit,我一直在努力。`expect_any_instance_of`等价于PHPUnit

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

我很努力地在PHPUnit中找到等价物。

这是我在代码中的场景:

<?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这是RemoteAPIClassObject实例的一部分。有没有什么办法可以在PHPUnit中做到这一点,所以我每次运行测试套件时都不需要对远程服务器进行远程API调用?

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

在rspec的我只想用我前面提到的方法存根电话:

expect_any_instance_of(RemoteAPIClassObject).to receive(:makeCall).and_return(some_stubbed_object)

也许我的策略是关闭的,我需要重新考虑我的测试?

+0

嗨!欢迎来到PHP世界。我过去使用过“Mockery”(PHPUnit模拟不如表达)。为了模拟http调用,'php-vcr'是一个不错的项目。 – fedeisas

回答

1

你会创建一个类的模拟对象,并使用它。

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

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

然而,这样做是不是一个好的做法。我们正在嘲笑我们正在测试的课程。允许您正在测试的课程获得模拟连接,我们可以将其传递到RemoteAPIClassObject并将其连接到一个响应中。这将允许您的代码不必实际进行远程API调用,并允许您可以进行连接的灵活性。

我无法提供更多详细信息,而无法查看有关正在测试的对象的更多信息。

+0

+1对于'允许您正在测试的课程接受模拟连接会更好' –