变量$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);
}
}
答案 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());
}
这可确保用户已登录并解耦测试。