【发布时间】:2016-02-02 06:10:43
【问题描述】:
所以我不确定我做错了什么,但是:
class Details {
public function details($href) {
$client = new Client();
$eveLog = new EveLogHandler();
$response = $client->request('GET', $href);
$eveLog->requestLog($response, 'eveonline_item_details.log');
if ($response->getStatusCode() === 200) {
return json_decode($response->getBody()->getContents());
}
return false;
}
}
我想模拟一下:$eveLog->requestLog($response, 'eveonline_item_details.log');
于是我写了一个测试:
class DetailsTest extends \PHPUnit_Framework_TestCase {
public function getLogMock() {
return $this->getMockBuilder('EveOnline\Logging\EveLogHandler')
->setMethods(['requestLog'])
->getMock();
}
public function testDetailsDoesNotReturnFalse() {
$details = new EveOnline\Items\Details();
$logger = $this->getLogMock();
$logger->expects($this->exactly(1))
->method('requestLog')
->with('request', 'request.log');
$response = $details->details('http://example.com');
$this->assertNotFalse($response);
}
}
接受它不会模拟方法调用,而是会因错误而吓坏:
1) DetailsTest::testDetailsDoesNotReturnFalse
Error: Call to undefined function EveOnline\Logging\storage_path()
现在这个方法:storage_path 是一个 laravel 方法,由于这个库在 laravel 之外,出于开发目的,该方法不存在,因此我试图模拟调用:$eveLog->requestLog($response, 'eveonline_item_details.log');
由此引发了两个问题:
- 首先,为什么我的测试没有发现我已经模拟了方法调用这一事实?
- 到了测试这个特定方法的时候,你如何模拟全局函数? Laravel 有几个,我需要模拟出
storage_path方法。
想法?
更新
应该知道,这个类通过提供者类和外观类变成了 laravel 外观,两者都注册到 laravel 允许我做类似的事情
EveDetails::details()
例如。在此处了解更多信息https://laravel.com/docs/5.1/facades
我可以发布外观和提供者类,这会有所帮助。
在我耳中实例化该类的唯一原因是因为这个特定组件正在构建为 laravel 的单独可安装组件。
【问题讨论】:
标签: php unit-testing mocking laravel-5.2