#php #phpspec
#php #phpspec
Вопрос:
У меня есть следующий класс, созданный с помощью PHPSpec:
class Consumer
{
public function __construct($accesskey, $accessToken)
{
// TODO: write logic here
}
}
Когда я тестирую конструктор, я получаю сообщение об ошибке, что в нем отсутствует аргумент 1. Ниже я описал поведение:
namespace specZizyAggregatorContext;
use ZizyAggregatorContextContractContextContractInterface;
use ZizyAggregatorContextConsumer;
use PhpSpecObjectBehavior;
use ProphecyArgument;
class ConsumerSpec extends ObjectBehavior
{
function it_is_initializable()
{
$this->beConstructedWith( md5('samplekey'), md5('sampletoken') );
$this->shouldHaveType(Consumer::class);
}
/**
* This spec describes how we would access our consumer directry
*/
public function it_gets_access_token()
{
$this->getAccessToken()->shouldReturn(md5('sampletoken'));
}
}
Ниже приведена ошибка, которую я получаю при запуске PHPSpec.
ZizyAggregatorContextConsumer 21 - it gets access token
warning: Missing argument 1 for ZizyAggregatorContextConsumer::__construct() in C:wamp64wwwspikessrcContextConsumer.php line 7
Я также пытался протестировать своего потребителя через интерфейс, но PHPSpec продолжает говорить мне, что он не может найти интерфейс, но в контексте класса, таким образом, предлагает мне возможность создать класс, в то время как на самом деле это должен быть интерфейс.
Как я могу также писать код через интерфейсы с PHPSpec?
Комментарии:
1. Я знаю об этом, но мне показалось уместным дать такой фон, чтобы любой, кто приходит мне на помощь, действительно понимал, откуда я иду, потому что для меня проблема была бы не только в PHPSpec, но и в том факте, что я использую библиотеку впервые, и, возможно, что нужно исправитьисправлен мой мыслительный процесс, а не реализация моего кода. Я надеюсь, что это удовлетворительное оправдание для вас.
2. Справедливо. Я постараюсь отредактировать свой вопрос таким образом, чтобы он не был загроможден ненужной информацией. Спасибо
3. Не уверен в этом, но в прошлом у меня были проблемы с именем класса спецификации, попробуйте переименовать
ConsumerBehavior
вConsumerSpec
4. Привет @gfv даже при изменении имени eclass на
ConsumerSpec
я все равно получаю ту же проблему. Я потрачу немного больше времени на изучение этого инструмента, потому что мне интересно, как он решает проблему разработки с нуля. Спасибо за ваше время.5. Если вы вставите полный код класса, который вы пытаетесь указать, я мог бы помочь вам в дальнейшем.
Ответ №1:
Вам нужно будет указать аргументы конструктора для каждого примера. Если вы обнаружите, что это слишком трудоемко, вы можете использовать let
для подготовки перед запуском каждого примера. В вашем случае должно сработать что-то вроде этого:
namespace specZizyAggregatorContext;
use ZizyAggregatorContextContractContextContractInterface;
use ZizyAggregatorContextConsumer;
use PhpSpecObjectBehavior;
use ProphecyArgument;
class ConsumerSpec extends ObjectBehavior
{
function let()
{
$this->beConstructedWith( md5('samplekey'), md5('sampletoken') );
}
function it_is_initializable()
{
$this->shouldHaveType(Consumer::class);
}
/**
* This spec describes how we would access our consumer directry
*/
public function it_gets_access_token()
{
$this->getAccessToken()->shouldReturn(md5('sampletoken'));
}
}