Сохранить переменную во время модульного тестирования Laravel - PullRequest
0 голосов
/ 20 марта 2019

Переменная $this->id не отображается в другой функции testExemple

Если я передам эту переменную нормальной функции, которая не запускается в «тесте», а не функции тестирования, все будет работать.

Можно это как-нибудь исправить?

class LoginTest extends TestCase
{
    protected $id;
    public function testLogin()
    {
        $response = $this->json('post', 'auth/login', 
            ['email' => 'admin@mail.com', 'password' => '12345678'])
            ->assertJsonStructure(['data' => ['id', 'name', 'email']]);

        $response->assertStatus(201);

        $userData = $response->getContent();
        $userData = json_decode($userData, true);
        $this->id = $userData['data']['id'];
    }
    public function testExemple()
    {
        echo($this->id);
    }
}

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Насколько мне известно, каждый тест выполняется независимо, если вы хотите передать данные из одного теста в другой, вы можете использовать комментарий документа @depends, как показано ниже:

class LoginTest extends TestCase
{
    public function testLogin()
    {
        $response = $this->json('post', 'auth/login', 
            ['email' => 'admin@mail.com', 'password' => '12345678'])
            ->assertJsonStructure(['data' => ['id', 'name', 'email']]);

        $response->assertStatus(201);

        $userData = $response->getContent();
        $userData = json_decode($userData, true);
        return $userData['data']['id']; //Return this for the dependent tests
    }

    /**
      * @depends testLogin
      */
    public function testExample($id)
    {
        echo($id);
    }
}

Однако проблема, с которой вы можете столкнуться, заключается в том, что, хотя $id имеет значение, пользователь фактически не вошел в систему во время этого теста, потому что все остальное (например, сеанс) будет очищено.

Чтобы убедиться, что пользователь вошел в систему, вам нужно будет смоделировать вход в систему, как показано ниже:

    public function testExample()
    {
        $this->actingAs(User::where('email', 'admin@mail.com')->first()); //User now logged in
        echo(\Auth::id());
    }

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

1 голос
/ 20 марта 2019

Это работает так, потому что модульные тесты должны быть независимыми .Переменная, заданная одним тестом, никогда не должна быть доступна для следующего.

Если ваша проблема заключается в том, что вам нужно тестировать вещи, требующие входа в систему, хорошим решением является создание нового класса, который расширяет * 1005.* и реализации вспомогательных функций, таких как loginUser() (которые могут возвращать экземпляр пользователя).

Затем ваши тесты должны расширять этот новый класс вместо прямого расширения TestCase.

Каждый раз, когда выЗапустите тест, который требует, чтобы вы вошли в систему, вы можете просто написать $this->loginUser() и продолжить свой реальный тест.

Если для всех тестов в классе требуется, чтобы вы вошли в систему, вы можете даже добавить setUp () функция, которая будет работать непосредственно перед выполнением любого теста (не забудьте также вызвать parrent::setUp():

protected function setUp() {
  parent::setUp();

  $this->loginUser();
}
...