Я пытаюсь проверить свой 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
Как выглядят ваши исходные данные в Postman? – RyanNerd
Я смущен. Как я могу это проверить? – Rohan
У вас есть что-нибудь в вашем помощнике? Как выглядит ваш файл yaml? Вы определили sendpost в своем помощнике и используете ли вы модуль rest? – Clay