在单元测试中保存变量Laravel

时间:2019-03-20 08:34:43

标签: php laravel unit-testing phpunit

变量$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 个答案:

答案 0 :(得分:1)

之所以这样,是因为单元测试应该独立进行。由一个测试设置的变量永远不能用于下一个测试。

如果您的问题是您需要测试要求登录的内容,那么一个好的解决方案是创建一个扩展TestCase的新类并实现诸如loginUser()之类的辅助函数(可以返回一个用户实例)。

然后应该让您的测试扩展这个新类,而不是直接扩展TestCase。

每次运行需要登录的测试时,您都可以编写$this->loginUser()并继续进行真正的测试。

如果一个类中的所有测试都要求您登录,则甚至可以添加一个setUp()函数,该函数将在执行任何测试之前立即运行(请记住还要调用parrent::setUp()

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

  $this->loginUser();
}

答案 1 :(得分:1)

据我所知,每个测试都是独立运行的,如果要将数据从一个测试传递到另一个测试,则可以使用@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());
    }

这可确保用户已登录并解耦测试。