2016-06-08 6 views
4

Я получаю вышеуказанную ошибку при тестировании моего приложения с помощью команды phpunit.Laravel 5.2 - Недопустимый аргумент, предоставленный foreach() - using phpunit

public function testProductCreationFailsWhenNameNotProvided() 
{ 
    $product = factory(\App\Product::class)->make(['name' => '']); 

    $this->post(route('api.products.store'), $product->jsonSerialize()) 
     ->seeJson(['name' => ['The name field is required.']]) /*line 86*/ 
     ->assertResponseStatus(422); 
} 

Полный отчет об ошибке здесь:

There was 1 error: 
1) ExampleTest::testProductCreationFailsWhenNameNotProvided 
ErrorException: Invalid argument supplied for foreach() 
C:\xampp\htdocs\product- service\vendor\laravel\framework\src\Illuminate\Support\Arr.php:494 
C:\xampp\htdocs\product-service\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\MakesHttpRequests.php:231 
C:\xampp\htdocs\product-service\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\MakesHttpRequests.php:257 
C:\xampp\htdocs\product-service\tests\ExampleTest.php:86 
C:\xampp\php\pear\PHPUnit\TextUI\Command.php:176 
C:\xampp\php\pear\PHPUnit\TextUI\Command.php:129 
FAILURES! 
Tests: 7, Assertions: 43, Errors: 1. 

Признаюсь, что этот код изначально не мой - он копируется из учебника Laravel. Там он отлично работал. К сожалению, ответ на этот связанный вопрос мне тоже не помог. Laravel 5.1 + PHPunit - API test returns always invalid argument error foreach

Я попытался изменить его, чтобы передать массив JSON в качестве параметра

public function testProductCreationFailsWhenNameNotProvided() 
    { 
     $product = factory(\App\Product::class)->make(['name' => '']); 

     $this->post(route('api.products.store'), $product->jsonSerialize()) 
      ->seeJson(json_encode(array('name' => ['The name field is required.']))) 
      ->assertResponseStatus(422); 
    } 

, но потом я получил эту ошибку:

1) ExampleTest::testProductCreationFailsWhenNameNotProvided 
TypeError: Argument 1 passed to Illuminate\Foundation\Testing\TestCase::seeJson() must be of the type array, string given, called in C:\xampp\htdocs\product-service\tests\ExampleTest.php on line 86 
+0

ли вы изменить что-нибудь в вашем коде на основе SO вопрос вы ссылаетесь, потому что вы делаете ту же ошибку, что там плакат этот вопрос был сделать - передача объекта, а не массив в 'seeJson() '. – Tex

+0

Возможный дубликат [Laravel 5.1 + PHPunit - API-тест возвращает всегда неверную ошибку аргумента foreach] (http://stackoverflow.com/questions/31921451/laravel-5-1-phpunit-api-test-returns-always-invalid- аргумент-ошибка-foreach) – Tex

+0

Да, я действительно пробовал различные комбинации, такие как -seeJson (json_encode (array ('name' => ['Поле имени обязательное.']))) и многое другое – Andrei

ответ

1

1) ExampleTest::testProductCreationFailsWhenNameNotProvided TypeError: Argument 1 passed to Illuminate\Foundation\Testing\TestCase::seeJson() must be of the type array, string given, called in C:\xampp\htdocs\product-service\tests\ExampleTest.php on line 86

Эта ошибка говорит вам, что вы прошли неправильный тип:

->seeJson(json_encode(array('name' => ['The name field is required.']))) 

Вы должны изменить его, чтобы он выглядел так, и тогда он должен работать.

->seeJson(array('name' => ['The name field is required.'])) 
Смежные вопросы