在 php 中添加一个方法
Stubbing a method in php
我有一个问题,我不知道怎么说,当 x 被调用时,它期望 y 至少被调用一次,我不关心 y 做什么,只要它被调用。
所以如果我们看这个例子:
public static function createAction($params) {
$postParams = $params->request()->post();
// Controller logic here ...
$params->redirect('/signin');
}
我想在下面的测试中做的是 - 我希望 redirect()
的参数 '/singin'
被调用 1 次。
我的测试看起来像:
<?php
use \GP\Models\User;
use Slim\Environment;
use \GP\Controllers\UserController;
class UserControllerTest extends PHPUnit_Framework_TestCase {
protected $em;
protected $app;
public function setUp() {
$this->em = getEntityManager(true);
$tool = new \Doctrine\ORM\Tools\SchemaTool($this->em);
$mdFactory = $this->em->getMetadataFactory();
$tool->dropSchema($mdFactory->getallMetadata());
$tool->createSchema($mdFactory->getallMetadata());
parent::setUp();
$_SESSION = array();
$this->app = new \Slim\Slim(array('mode' => 'testing'));
}
public function tearDown() {
$tool = new \Doctrine\ORM\Tools\SchemaTool($this->em);
$mdFactory = $this->em->getMetadataFactory();
$tool->dropSchema($mdFactory->getallMetadata());
parent::tearDown();
}
public function testUserCreate() {
Environment::mock(array(
'REQUEST_METHOD' => 'POST',
'slim.input' => 'firstname=user&lastname=somethingelse&username=admin&email=a@gmail.com&password=1234567890&repassword=1234567890'
));
UserController::createAction($this->app);
$user = $this->em->getRepository('\GP\Models\User')
->findBy(array('user_name' => 'admin'));
$this->assertNotEmpty($user);
}
}
当它 运行 我得到:
$ phpunit
PHPUnit 4.6.6 by Sebastian Bergmann and contributors.
Configuration read from /var/www/html/Grab-Project/phpunit.xml
....E
Time: 13.45 seconds, Memory: 21.25Mb
There was 1 error:
1) UserControllerTest::testUserCreate
Slim\Exception\Stop:
/var/www/html/Grab-Project/vendor/slim/slim/Slim/Slim.php:1022
/var/www/html/Grab-Project/vendor/slim/slim/Slim/Slim.php:1042
/var/www/html/Grab-Project/vendor/slim/slim/Slim/Slim.php:1105
/var/www/html/Grab-Project/app/Controllers/UserController.php:73
/var/www/html/Grab-Project/tests/app/controllers/UserControllerTest.php:40
FAILURES!
Tests: 5, Assertions: 8, Errors: 1.
尝试调用重定向时会出现此问题。这是因为我没有在我的测试中指定 slim 应该重定向到哪里,而是我想存根那个方法并说,我希望在数据库中找到这个用户,就像我一样,我希望这个带有这个参数的方法被调用一次.
我在 rails 中如何做到这一点,但阅读 documentation 令我困惑...
如果$params->redirect('/signin');是它打破的线我认为你应该能够解决这个问题。
在设置中:
$this->app = $this->getMock(
'\Slim\Slim',
array('redirect'),
array(array('mode' => 'testing'))
);
array(array( 是故意的,因为它是一个构造函数参数数组,而你的构造函数看起来需要一个数组作为第一个参数。
然后您可以将其添加到您的测试函数中。
$this->app->expects($this->once())->method('redirect');
我有一个问题,我不知道怎么说,当 x 被调用时,它期望 y 至少被调用一次,我不关心 y 做什么,只要它被调用。
所以如果我们看这个例子:
public static function createAction($params) {
$postParams = $params->request()->post();
// Controller logic here ...
$params->redirect('/signin');
}
我想在下面的测试中做的是 - 我希望 redirect()
的参数 '/singin'
被调用 1 次。
我的测试看起来像:
<?php
use \GP\Models\User;
use Slim\Environment;
use \GP\Controllers\UserController;
class UserControllerTest extends PHPUnit_Framework_TestCase {
protected $em;
protected $app;
public function setUp() {
$this->em = getEntityManager(true);
$tool = new \Doctrine\ORM\Tools\SchemaTool($this->em);
$mdFactory = $this->em->getMetadataFactory();
$tool->dropSchema($mdFactory->getallMetadata());
$tool->createSchema($mdFactory->getallMetadata());
parent::setUp();
$_SESSION = array();
$this->app = new \Slim\Slim(array('mode' => 'testing'));
}
public function tearDown() {
$tool = new \Doctrine\ORM\Tools\SchemaTool($this->em);
$mdFactory = $this->em->getMetadataFactory();
$tool->dropSchema($mdFactory->getallMetadata());
parent::tearDown();
}
public function testUserCreate() {
Environment::mock(array(
'REQUEST_METHOD' => 'POST',
'slim.input' => 'firstname=user&lastname=somethingelse&username=admin&email=a@gmail.com&password=1234567890&repassword=1234567890'
));
UserController::createAction($this->app);
$user = $this->em->getRepository('\GP\Models\User')
->findBy(array('user_name' => 'admin'));
$this->assertNotEmpty($user);
}
}
当它 运行 我得到:
$ phpunit
PHPUnit 4.6.6 by Sebastian Bergmann and contributors.
Configuration read from /var/www/html/Grab-Project/phpunit.xml
....E
Time: 13.45 seconds, Memory: 21.25Mb
There was 1 error:
1) UserControllerTest::testUserCreate
Slim\Exception\Stop:
/var/www/html/Grab-Project/vendor/slim/slim/Slim/Slim.php:1022
/var/www/html/Grab-Project/vendor/slim/slim/Slim/Slim.php:1042
/var/www/html/Grab-Project/vendor/slim/slim/Slim/Slim.php:1105
/var/www/html/Grab-Project/app/Controllers/UserController.php:73
/var/www/html/Grab-Project/tests/app/controllers/UserControllerTest.php:40
FAILURES!
Tests: 5, Assertions: 8, Errors: 1.
尝试调用重定向时会出现此问题。这是因为我没有在我的测试中指定 slim 应该重定向到哪里,而是我想存根那个方法并说,我希望在数据库中找到这个用户,就像我一样,我希望这个带有这个参数的方法被调用一次.
我在 rails 中如何做到这一点,但阅读 documentation 令我困惑...
如果$params->redirect('/signin');是它打破的线我认为你应该能够解决这个问题。
在设置中:
$this->app = $this->getMock(
'\Slim\Slim',
array('redirect'),
array(array('mode' => 'testing'))
);
array(array( 是故意的,因为它是一个构造函数参数数组,而你的构造函数看起来需要一个数组作为第一个参数。
然后您可以将其添加到您的测试函数中。
$this->app->expects($this->once())->method('redirect');