PhpUnit和Laravel 5.4如何在测试期间模拟Session数据?

6
我在使用phpunit测试一个基于laravel5.4的类,该类使用session来获取数据。当应用程序正在运行时直接访问session("session('consumer')")可以正常获取到值,但是当我尝试测试使用session的函数时,会出现以下错误:
ReflectionException: 类 session 不存在
请问有人能指导如何在测试期间设置session数据吗?
我已经尝试使用:$this->session()->put([$array_value]) ,但是会得到“class session does not exist on class_im_testing”的错误。
谢谢您的帮助!
public function test_get_user()
{
    $mockUser =  [
        'id' => 'cf442564-d076-4198-beb5-edef5aa51a69',
        'name' => 'John Doe',
        'fname' => 'John',
        'lname' => 'Doe',  
    ];

    session->put('consumer', [
        'id' => 'cf442564-d076-4198-beb5-edef5aa51a69',
        'name' => 'John Doe',
        'fname' => 'John',
        'lname' => 'Doe',  
    ]);

    $user = $this->repo->getUser();

    $this->assertEqual($user, $mockUser);
}

public function getUser()
{
   $user = new User(session('consumer'));
   return $user;
}

3
根据文档,应该使用$this->withSession([...]) - apokryfos
@apokryfos 也许我们没有实例化某些东西,使我们能够在测试中使用会话,有什么建议吗? - Leevashan
2
确保你的测试用例继承自 Laravel 自带的 TestCase 类,而不是默认的 PhpUnit 测试用例类。 - apokryfos
@apokryfos 看起来测试类实际上导入了 phpunit 的 testCase 类,而不是 Laravel 的 testCase 类,我现在将进行更新并检查,谢谢! - Leevashan
2
Laravel的测试用例继承了这个TestCase,它有很多额外的方法,还包括许多traits。你的withSession方法实际上来自InteractsWithSession,这是其中一个包含的traits。 - apokryfos
显示剩余4条评论
1个回答

7

Laravel提供了许多方法来帮助测试,但为了使用它们,您需要确保使用正确的类。

如果您使用默认的样板文件,则会得到一个名为TestCase的类。这是您需要扩展以获取$this->withSession等方法的类。

这是因为测试用例扩展了Framework TestCase类,该类又包括许多trait,其中之一是traitInteractsWithSession,它实际上提供了withSession方法。

此外,Laravel TestCase还扩展了PhpUnit测试用例,因此您仍然可以访问所有PhpUnit断言。


谢谢你的指导,正如Levashan所指出的那样,导入正确的TestCase类解决了我们的问题。 - Herchelle Botha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接