我創建了下面的例子測試用例:如何嘲笑在PHP中靜態聲明的方法時,單元測試
<?php
abstract class Model
{
//...
public static function factory($data)
{
$className = get_called_class();
$obj = new $className($data);
return $obj;
}
}
class User extends Model
{
}
class ExampleController
{
protected $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function create()
{
return $this->user->factory(array('name' => 'Jim'));
}
}
class ExampleTest extends PHPUnit_Framework_TestCase
{
public function testSomething()
{
$user = new User(array('name' => 'Jim'));
$modelStub = $this->getMockBuilder('User')
->disableOriginalConstructor()
->getMock();
$modelStub
->method('factory')
->with(array('name' => 'Jim'))
->willReturn($user);
$example = new ExampleController($modelStub);
$this->assertEquals($user, $example->create());
}
}
不過,我得到以下錯誤:
1) ExampleTest::testSomething
PHPUnit_Framework_MockObject_BadMethodCallException:
我似乎好工作,當我刪除static
關鍵字,然後我的測試通過。但我想我的模型類中,也允許,在其他情況下,可以選擇調用某些方法,而無需先實例:
// when instantiation is required
$userModel = new User();
$user = $userModel->factory(array('name' => 'Jim'));
// called statically, no initial instantiation required
$user = User::factory(array('name' => 'Jim'));
我碰到這個博客裏面說的方法靜態聲明,但動態地叫出來,是好。然而,方法動態申報,但靜態調用,將引發嚴格的錯誤 - http://www.lornajane.net/posts/2010/declaring-static-methods-in-php
我也用Laravel雄辯之前,看來,這兩種方法調用可能有:
// Eloquent example without initial instantiation is possible too
$user = User::find(1);
無論如何,不管無論我的代碼是否工作,我希望能夠模擬靜態聲明這些方法。讀起來似乎PHPUnit並沒有很好地處理靜態方法(我讀過那裏有一個staticExpects方法,但現在不推薦使用PHPUnit 3.8)。所以我即將開始嘗試一些其他的測試框架(Codeception和AspectMock,PHPSpec,嘲笑),因爲我沒有太多的經驗與其他人。真的很感謝這個問題的一些建議或者對這個問題的建議,因爲在我們公司對遺留應用程序進行單元測試真的有幫助,謝謝
沒有工具可以模擬靜態方法。儘可能避免靜態方法的另一個原因。 –
您正在將該方法聲明爲static,但將其稱爲類方法:'return $ this-> user-> factory(array('name'=>'Jim'));' – hek2mgl