Intereting Posts
Не работает PHP echo echo? Внедрение системы чата с помощью веб-браузера PHP нечувствительный к регистру взрыв () Вспоминая выбор пользователей с одной страницы на другую Иностранный ключ, не хранящийся в Yii Doctrine 2.0 выбрать проблему запроса? Номер строки журнала выполненного кода Java Перенаправление на вход в систему, когда пользователь не вошел в систему, или пользователь пытается получить доступ к странице напрямую с URL-адреса, используя angularjs Удалить корневой каталог из строки пути каталога – PHP SQLSTATE Нет такого файла или каталога Проверьте, не связаны ли ссылки на php Используя WordPress, может ли кто-нибудь сказать мне лучший способ дезинфекции ввода? Как проверить, содержит ли строка «url или link» и извлекает ее Каковы преимущества (и недостатки) слабо типизированного языка? Загрузка нескольких файлов в PHP с использованием HTML-формы или cURL

PHPSpec и Laravel – как обращаться с двойным методом не найдены проблемы

Кажется, у меня проблемы с моими спецификационными тестами, когда речь идет о заглушках, вызывающих другие методы.

Я выполнял шестигранный подход Laracasts для моего контроллера, чтобы гарантировать, что он отвечает только за уровень HTTP.

контроллер

<?php use Apes\Utilities\Connect; use \OAuth; class FacebookConnectController extends \BaseController { /** * @var $connect */ protected $connect; /** * Instantiates $connect * * @param $connect */ function __construct() { $this->connect = new Connect($this, OAuth::consumer('Facebook')); } /** * Login user with facebook * * @return void */ public function initialise() { // TODO: Actually probably not needed as we'll control // whether this controller is called via a filter or similar if(Auth::user()) return Redirect::to('/'); return $this->connect->loginOrCreate(Input::all()); } /** * User authenticated, return to main game view * @return Response */ public function facebookConnectSucceeds() { return Redirect::to('/'); } } 

Поэтому, когда маршрут инициализирован, я создаю новый экземпляр Connect и передаю экземпляр класса $ this в мой класс Connect (чтобы выступать в качестве слушателя) и вызывать метод loginOrCreate.

Apes \ Utilities \ Connect

 <?php namespace Apes\Utilities; use Apes\Creators\Account; use Illuminate\Database\Eloquent\Model; use \User; use \Auth; use \Carbon\Carbon as Carbon; class Connect { /** * @var $facebookConnect */ protected $facebookConnect; /** * @var $account */ protected $account; /** * @var $facebookAuthorizationUri */ // protected $facebookAuthorizationUri; /** * @var $listener */ protected $listener; public function __construct($listener, $facebookConnect) { $this->listener = $listener; $this->facebookConnect = $facebookConnect; $this->account = new Account(); } public function loginOrCreate($input) { // Not the focus of this test if(!isset($input['code'])){ return $this->handleOtherRequests($input); } // Trying to stub this method is my main issue $facebookUserData = $this->getFacebookUserData($input['code']); $user = User::where('email', '=', $facebookUserData->email)->first(); if(!$user){ // Not the focus of this test $user = $this->createAccount($facebookUserData); } Auth::login($user, true); // I want to test that this method is called return $this->listener->facebookConnectSucceeds(); } public function getFacebookUserData($code) { // I can't seem to stub this method because it's making another method call $token = $this->facebookConnect->requestAccessToken($code); return (object) json_decode($this->facebookConnect->request( '/me' ), true); } // Various other methods not relevant to this question 

Я попытался урезать это, чтобы сосредоточиться на тестируемых методах, и до сих пор понимаю, что происходит не так.

Connect Spec

 <?php namespace spec\Apes\Utilities; use PhpSpec\ObjectBehavior; use Prophecy\Argument; use \Illuminate\Routing\Controllers\Controller; use \OAuth; use \Apes\Creators\Account; class ConnectSpec extends ObjectBehavior { function let(\FacebookConnectController $listener, \OAuth $facebookConnect, \Apes\Creators\Account $account) { $this->beConstructedWith($listener, $facebookConnect, $account); } function it_should_login_the_user($listener) { $input = ['code' => 'afacebooktoken']; $returnCurrentUser = (object) [ 'email' => 'existinguser@domain.tld', ]; $this->getFacebookUserData($input)->willReturn($returnCurrentUser); $listener->facebookConnectSucceeds()->shouldBeCalled(); $this->loginOrCreate($input); } 

Итак, вот спецификация, с которой у меня проблемы. Сначала я притворяюсь, что у меня уже есть токен. Затем, когда ситуация терпит неудачу, я хочу, чтобы метод getFacebookUserData возвращал образец пользователя, который существует в моей таблице пользователей.

Однако, когда я запускаю тест, я получаю:

 Apes/Utilities/Connect 37 ! it should login the user method `Double\Artdarek\OAuth\Facade\OAuth\P13::requestAccessToken()` not found. 

Я надеялся, что «willReturn» просто проигнорирует все, что происходит в методе getFacebookUserData, поскольку я тестирую это отдельно, но, похоже, это не так.

Какие-либо рекомендации о том, что я должен делать?

Нужно ли мне переводить все методы класса OAuth в их собственный класс или что-то еще? Мне кажется странным, что мне может потребоваться сделать это, поскольку OAuth уже является его собственным классом. Есть ли способ заглушить метод в getFacebookUserData?

Обновление 1

Поэтому я попытался выполнить метод, который вызывается внутри getFacebookUserData, и мои обновленные спецификации выглядят следующим образом:

 function it_should_login_the_user($listener, $facebookConnect) { $returnCurrentUser = (object) [ 'email' => 'existinguser@domain.tld', ]; $input = ['code' => 'afacebooktoken']; // Try stubbing any methods that are called in getFacebookUserData $facebookConnect->requestAccessToken($input)->willReturn('alongstring'); $facebookConnect->request($input)->willReturn($returnCurrentUser); $this->getFacebookUserData($input)->willReturn($returnCurrentUser); $listener->facebookConnectSucceeds()->shouldBeCalled(); $this->loginOrCreate($input); } 

Спектр все еще не работает, но ошибка изменилась:

 Apes/Utilities/Connect 37 ! it should login the user method `Double\Artdarek\OAuth\Facade\OAuth\P13::requestAccessToken()` is not defined. 

Интересно, если я поместил эти новые заглушки после заглушки $ this-> getFacebookUserData, тогда ошибка «не найдена» вместо «не определена». Ясно, что я не совсем понимаю внутреннюю работу: D