2015-05-07 3 views
0

У меня проблема, когда я не знаю, как сказать, когда вызывается x, он ожидает, что y будет вызван хотя бы один раз, и мне все равно, что делает y, если его называется.Stubbing метод в php

Так что, если мы посмотрим на этом примере:

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 protected]&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 должен перенаправить, вместо этого я хочу заглушить этот метод и сказать, что я ожидаю найти этого пользователя в базе данных, как и я, и я ожидаю, что этот метод с этим параметром будет вызван один раз ,

Я, как сделать это в рельсах, но чтение documentation сбивает с толку меня ...

ответ

1

Если $ params-> перенаправлять ('/ зарегистрировались'); это линия, которую она ломает, я думаю, вы должны решить эту проблему.

В установке:

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

массива (массив (на цели, как это массив аргументов конструктора и ваш constuctor выглядит, как он хочет массив как первые пары

Это вы можете. затем добавьте в свою тестовую функцию.

$this->app->expects($this->once())->method('redirect'); 
Смежные вопросы