Как сделать ИЛИ утверждения в тестировании - PullRequest
0 голосов
/ 11 мая 2018

У меня есть API для регистрации пользователей с некоторыми полями, которые вы ожидаете от обычной регистрации пользователя

API возвращает ответ примерно так, когда регистрация прошла успешно

{
    "response": {
        "httpCode": 200,
        "Message": "Registration is complete."
    }
}

Но иногда может случиться так, что электронная почта уже получена, в этом случае возвращается подходящее сообщение с кодом состояния 400

{
    "response": {
        "httpCode": 400,
        "Message": "Email already taken."
    }
}

Сейчас я на тестировании, для которого я написал этот тест

public function testSignup()
{

    $response = $this->call('POST', '/api/signup', [

                            'first_name' => 'abc',
                            'last_name' => 'xyz',
                            'username' => 'iamgroot',
                            'email' => 'hello@example.com',

                ]);

    $response->assertStatus(200)->assertJsonStructure([

        'response' => [ 'httpCode' , 'Message' ]

    ]);

}   

При выдаче свежего электронного письма в тестовом сценарии оно проходит (вместе с другими тестами), но при повторном запуске того же теста оно, очевидно, дает сбой, поскольку ответ отличается, но, говоря техническим языком, на самом деле это не ошибка, и код работает как ожидается, так как я могу сделать что-то вроде ИЛИ, чтобы при наличии любого из двух форматов ответа это прошло, так как добавление просто другого утверждения для кода состояния 400 будет просто И им.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Пожалуйста, попробуйте следующее:

$this->assertThat(
    $response->getStatusCode(),
    $this->logicalOr(
        $this->equalTo(200),
        $this->equalTo(400)
    )
);

$response->assertJsonStructure([
      'response' => [ 'httpCode' , 'Message' ]
]);

Сначала будет подтверждено, что ответ равен либо 200, либо 400, и только затем мы утвердим структуру JSON.

0 голосов
/ 11 мая 2018

У Laravel есть черта DatabaseTransactions.

use Illuminate\Foundation\Testing\DatabaseTransactions;

class MyTest extends TestCase
{
    use DatabaseTransactions;

    public function testSignup()
    {

        $response = $this->call('POST', '/api/signup', [
            'first_name' => 'abc',
            'last_name' => 'xyz',
            'username' => 'iamgroot',
            'email' => 'hello@example.com',
        ]);

        $response->assertStatus(200)->assertJsonStructure([
            'response' => [ 'httpCode' , 'Message' ]
        ]);
    }
}

Эта черта будет использовать транзакции, откатывать данные после каждого теста.Затем вы можете создать второй тест, чтобы вызвать ошибку, примерно так:

    public function testSignupError()
    {
        $email = 'test@example.com';
        //create an user to take the email
        factory(\App\User::class)->create(['email'=>$email]);

        $response = $this->call('POST', '/api/signup', [
            'first_name' => 'abc',
            'last_name' => 'xyz',
            'username' => 'iamgroot',
            'email' => $email,
        ]);

        $response->assertStatus(400);
    }

Или вы можете избежать черты базы данных транзакций и просто создать новый метод с другим адресом электронной почты.В любом случае, используйте RefreshDatabase trait для очистки всех данных перед началом испытаний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...