Поведенческая разработка не оправдывает моих ожиданий с PHPSpec

#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'));
    }
}