我是一名探索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
也许我的策略已经结束,我需要重新考虑我的考试?
答案 0 :(得分:1)
您将创建一个类的模拟对象并使用它。
$api_interface = $this->getMockBuilder('RemoteAPIClassObject')
->setMethods(['makeCall'])
->getMock();
$api_interface->expects($this->once())
->method('makeCall')
->willReturn((object)['api_response' => 'foo']);
这样做并不是一个好习惯。我们正在嘲笑我们要测试的课程。最好允许您正在测试的类接收模拟连接,我们可以将其传递给RemoteAPIClassObject
并将其存根以进行响应。这将允许您的代码不必实际进行远程api调用,并允许您可以灵活地进行连接。
如果没有详细了解您正在测试的对象,我无法提供更多详细信息。