【问题标题】:Stubbing a method in php在php中存根方法
【发布时间】:2015-07-18 15:43:36
【问题描述】:

我有一个问题,我不知道怎么说,当 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 让我感到困惑......

【问题讨论】:

    标签: php mocking phpunit stubbing


    【解决方案1】:

    如果 $params->redirect('/signin');是它打破的那条线,我认为你应该能够解决这个问题。

    在设置中:

    $this->app = $this->getMock(
      '\Slim\Slim', 
      array('redirect'), 
      array(array('mode' => 'testing'))
    );
    

    array(array( 是故意的,因为它是一个构造函数参数数组,而你的构造函数看起来想要一个数组作为第一个参数。

    然后您可以将其添加到您的测试函数中。

    $this->app->expects($this->once())->method('redirect');
    

    【讨论】:

      猜你喜欢
      • 2011-02-02
      • 2021-02-09
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多