rr.*_*rr. 46 php phpunit unit-testing doctrine mocking
我正在寻找测试以下静态方法的最佳方法(特别是使用Doctrine模型):
class Model_User extends Doctrine_Record
{
public static function create($userData)
{
$newUser = new self();
$newUser->fromArray($userData);
$newUser->save();
}
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我会使用模拟对象来确保调用"fromArray"(使用提供的用户数据)和"save",但这是不可能的,因为该方法是静态的.
有什么建议?
Gor*_*don 43
PHPUnit的作者Sebastian Bergmann最近发表了一篇关于Stubbing和Mocking Static Methods的博客文章.使用PHPUnit 3.5和PHP 5.3以及后期静态绑定的一致使用,你可以做到
$class::staticExpects($this->any())
->method('helper')
->will($this->returnValue('bar'));
Run Code Online (Sandbox Code Playgroud)
更新: staticExpects被弃用的PHPUnit 3.8的,将被更高版本的完全去除.
tre*_*ace 11
现在有AspectMock库来帮助解决这个问题:
https://github.com/Codeception/AspectMock
$this->assertEquals('users', UserModel::tableName());
$userModel = test::double('UserModel', ['tableName' => 'my_users']);
$this->assertEquals('my_users', UserModel::tableName());
$userModel->verifyInvoked('tableName');
Run Code Online (Sandbox Code Playgroud)
我将在单元测试命名空间中创建一个新类来扩展Model_User并测试它。这是一个例子:
原班:
class Model_User extends Doctrine_Record
{
public static function create($userData)
{
$newUser = new self();
$newUser->fromArray($userData);
$newUser->save();
}
}
Run Code Online (Sandbox Code Playgroud)
在单元测试中调用的模拟类:
use \Model_User
class Mock_Model_User extends Model_User
{
/** \PHPUnit\Framework\TestCase */
public static $test;
// This class inherits all the original classes functions.
// However, you can override the methods and use the $test property
// to perform some assertions.
}
Run Code Online (Sandbox Code Playgroud)
在您的单元测试中:
use Module_User;
use PHPUnit\Framework\TestCase;
class Model_UserTest extends TestCase
{
function testCanInitialize()
{
$userDataFixture = []; // Made an assumption user data would be an array.
$sut = new Mock_Model_User::create($userDataFixture); // calls the parent ::create method, so the real thing.
$sut::test = $this; // This is just here to show possibilities.
$this->assertInstanceOf(Model_User::class, $sut);
}
}
Run Code Online (Sandbox Code Playgroud)