【发布时间】:2020-07-17 13:44:14
【问题描述】:
我正在尝试编写这个类的测试。
class Page
{
private function getPage(){
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "http://example.com/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_POSTFIELDS => "",
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
return $response;
}
public function getTitle()
{
$page = $this->getPage();
$re = '/(<title>)(.*?)(<\/title>)/m';
preg_match_all($re, $page, $matches, PREG_SET_ORDER, 0);
return $matches[0][2];
}
}
而且由于我的getPage方法访问的是外部资源,所以我需要为它构建Mock
namespace Tests;
use PHPUnit\Framework\TestCase;
use App\Kernel\Page;
class PageTest extends TestCase
{
public function testGetTitle()
{
$stub = $this->createMock(Page::class);
$stub->method('getPage')
->willReturn('<title>Example Domain</title>');
$this->assertSame('Example Domain', $stub->getTitle());
}
}
当我调用测试时出现错误:
1) 测试\PageTest::testGetTitle 尝试配置无法配置的方法“getPage”,因为它不存在、尚未指定、是最终的或静态的
我看了那里的测试示例,他们说要这样做,但是为什么会发生错误,我不记得了 - 谁能告诉我如何测试这样的代码?
【问题讨论】:
-
这可能与它是
private方法有关 - stackoverflow.com/questions/5937845/…。 -
一切都清楚了——但是怎么测试呢,我不会为了测试把被测试类中的所有代码都改掉
-
这是一个很奇怪的代码设计。你有一个处理一个特定页面的类?很难测试这样的东西。