2015-12-13 2 views
2

Я пытаюсь проверить свой API с помощью Codeception, и я тестирую каждую конечную точку. Мои тесты выглядят так:Запросы коллаборации, возвращающие неожиданные ответы?

<?php 
$faker = Faker\Factory::create(); 

$I = new ApiTester($scenario); 
$I->wantTo('create a new user'); 
$I->useToken(); 
$I->sendPost('users', [ 
    "first_name" => "Test", 
    "last_name"  => "Test", 
    "email"   => '[email protected]', 
    "password"  => "testing", 
    "role"   => "1" 
]); 
$I->seeResponseCodeIs(200); 
$I->seeResponseIsJson(); 
$I->seeResponseContainsJson(['status' => 'success']); 
$I->seeResponseContainsJson(['data' => [ 
    'first_name' => 'Test' 
]]); 
$I->seeInDatabase('user', [ 
    "first_name" => "Test", 
    "last_name"  => "Test", 
    "email"   => '[email protected]' 
]); 

Теперь эти тесты не подтверждают, что статус имеет успех. Вместо этого я вижу отказ статуса, и причина возвращается мне как 404 Route Not Found. Но когда я делаю тот же запрос с помощью Postman, он работает отлично, а новый пользователь создается в базе данных.

Я проверил файл routes.php, и это выглядит очень хорошо для меня. Я разместил ресурс пользователя в нем, как так:

Route::resource('users', 'UserController'); 

Кроме того у меня есть другие тесты, как:

<?php 


$I = new ApiTester($scenario); 
$I->wantTo('create a new comment'); 
$I->useToken(); 
$I->sendPost('comments', [ 
    "document_id" => "1", 
    "comment_type_id" => "1", 
    "user_id" => "1", 
    "body" => "Testing" 
]); 
$I->seeResponseCodeIs(200); 
$I->seeResponseIsJson(); 
$I->seeResponseContainsJson(['status' => 'success']); 
$I->seeInDatabase('comment', [ 
    "document_id" => "1", 
    "comment_type_id" => "1", 
    "user_id" => "1", 
    "body" => "Testing" 
]); 

И это работает, и утверждая, просто отлично. Но когда я намеренно пропустил несколько полей в методе sendPost, чтобы проверить проверки на месте, опять же проблема ->404 Route Not Found, что довольно странно. Это происходит и с другими тестами. Некоторые говорят, что маршрут не найден таким, какой он есть, и некоторые бросают это исключение, когда мне не хватает некоторых аргументов, чтобы заставить их как-то пройти проверку. Я не уверен, что я делаю неправильно здесь.

codeception.yml

actor: Tester 
paths: 
    tests: tests 
    log: tests/_output 
    data: tests/_data 
    support: tests/_support 
    envs: tests/_envs 
settings: 
    bootstrap: _bootstrap.php 
    colors: true 
    memory_limit: 1024M 
extensions: 
    enabled: [Codeception\Extension\RunFailed] 
modules: 
    config: { Db: { dsn: 'mysql:host=localhost;dbname=carparts', user: homestead, password: secret, dump: tests/_data/dump.sql } } 

api.suite.yml

class_name: ApiTester 
modules: 
    enabled: 
     - Laravel5 
     - Db 
     - PhpBrowser: 
      url: 'http://archive.app/api' 
      curl: 
       CURLOPT_RETURNTRANSFER: true 
     - REST: 
      url: /api/ 
      depends: PhpBrowser 
    config: 
     Laravel5: 
      environment_file: .env.testing 

ApiTester.php

class ApiTester extends \Codeception\Actor 
{ 
    use _generated\ApiTesterActions; 

    /** 
    * Define custom actions here 
    */ 

    public function saveToken($response) 
    { 
     file_put_contents('tests/api/token', json_decode($response)->token); 
    } 

    public function saveSuperToken($response) 
    { 
     file_put_contents('tests/api/superToken', json_decode($response)->token); 
    } 

    public function saveFakeToken($response) 
    { 
     file_put_contents('tests/api/fakeToken', json_decode($response)->token); 
    } 

    public function useToken() 
    { 
     $I = $this; 
     $I->haveHttpHeader('Authorization', 'Bearer ' . file_get_contents('tests/api/token')); 
    } 

    public function useSuperToken() 
    { 
     $I = $this; 
     $I->haveHttpHeader('Authorization', 'Bearer ' . file_get_contents('tests/api/superToken')); 
    } 

    public function useFakeToken() 
    { 
     $I = $this; 
     $I->haveHttpHeader('Authorization', 'Bearer ' . file_get_contents('tests/api/fakeToken')); 
    } 
} 

--debug выход опция

[Request headers] {"Authorization":"Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImNhcnBhcnRzIiwic3ViIjoxLCJpc3MiOiJodHRwOlwvXC9hcmNoaXZlLmFwcFwvYXBpXC9hdXRoZW50aWNhdGUiLCJpYXQiOjE0NTAwODg5NzMsImV4cCI6MTQ1MDE0Mjk3MywibmJmIjoxNDUwMDg4OTczLCJqdGkiOiIxOTM4YmU0OWZhZjIyMTE5ZjJhZDY0ZDAwOTJhZTExOSJ9.Gsc0Acxq7QPMOejMHRJ4yCYAhxnDUscGqo1-NbT7gIM"} 
    [Request] POST /api/users {"first_name":"Test","last_name":"Test","email":"[email protected]","password":"testing","role":"1"} 
    [Response] {"status":"error","data":[null],"errors":null,"message":"404 Route Not Found"} 
    [Cookies] {"laravel_session":"eyJpdiI6Im03Smh5VUZJMEdJVUVjVDZxRlpzVVE9PSIsInZhbHVlIjoiWHF2aTQ5MXZWbnl2eU5OREc4cDhmOENEeUlGRzRKbVpuYXFQeW9WMlVzQjRUT2hTZldWVnJ4SmVFTEJ3Y1lKblwvQWlWalhWSkVEUW95b0t2QkxkTDJBPT0iLCJtYWMiOiI2N2MwYmM3N2JjZTI5NWE2NjAyMWY3OWI3ZDJkMDQzNGU5ZTk2ODBkNmNiNmRhZWVhOTdlZmEzYWUyNDI4YzA3In0="} 
    [Headers] {"Server":["nginx/1.8.0"],"Content-Type":["application/json"],"Transfer-Encoding":["chunked"],"Connection":["keep-alive"],"Cache-Control":["no-cache"],"Date":["Mon, 14 Dec 2015 10:29:55 GMT"]} 
    [Status] 200 
+0

Как выглядят ваши исходные данные в Postman? – RyanNerd

+0

Я смущен. Как я могу это проверить? – Rohan

+0

У вас есть что-нибудь в вашем помощнике? Как выглядит ваш файл yaml? Вы определили sendpost в своем помощнике и используете ли вы модуль rest? – Clay

ответ

0

Можете ли вы дать нам снимок экрана Почтальон, который работает? enter image description here

+0

Я использую данные формы для тела, поэтому, когда я переключаюсь на raw, я ничего не вижу. Он пуст. – Rohan

0

Вероятной причиной этой проблемы является то, что модуль Laravel5 включен в api.suite.yml

Laravel5 (и других каркасных модулей) не совместимы с PhpBrowser и, как включена очень распространенная проблема.

seeResponseCodeIs метод предоставляется модулями Laravel5, PhpBrowser и REST.
Клиент разделяется между модулем REST и модулем, от которого он зависит, но очень вероятно, что seeResponseCodeIs, предоставленный Laravel5, используется ApiTester.

Решение состоит в том, чтобы удалить модуль Laravel5 из этого пакета.

Смежные вопросы