【问题标题】:Laravel 5.0 Unit Testing problems with Session variablesLaravel 5.0 会话变量的单元测试问题
【发布时间】:2016-10-01 02:03:52
【问题描述】:

我正在尝试对一些现有代码进行一些单元测试。我的控制器看起来像

class DefaultController extends Controller
{
    public function index() {
        if (!Session::get('answers', [])) {
            App::abort(403, 'Error.');
        }

        // Do rest of the stuff here
    }
}

我的测试类看起来像

class DefaultController extends extends TestCase {
    public function testIndex_withoutSession() {
        // Arrange
        /* Nothing to arrange now */

        // Act
        $this->action('GET', 'DefaultController@index');

        // Assert
        $this->assertResponseStatus(403);
    }

    public function testIndex_withSession() {
        // Arrange
        $this->session(['answers' => array()]);

        // Act
        $this->action('GET', 'ParticipantController@create');

        $this->assertSessionHas('answers');
        // this function is giving true

        // Assert
        $this->assertResponseStatus(200);

        $this->flushSession();
    }
}

我没有会话的测试用例工作正常,但是当我想通过模拟会话变量“答案”来检查它时,它仍然给我错误。任何人都可以通过弄清楚我做错了什么或如何正确做来帮助我吗?没有这个,我无法进一步检查代码。 提前致谢。

【问题讨论】:

    标签: unit-testing laravel laravel-5 phpunit


    【解决方案1】:

    你有$this->session(['answers' => array()]); 但是你在这里寻找答案而不是答案$this->assertSessionHas('answer'); 答案中多余或缺少的“s”是问题所在。

    【讨论】:

    • 感谢您的回答。这只是重写此代码时的一个错字。但还是失败了。 @MrCode 的解决方案给了我结果。我正在编辑代码中的错字,就好像其他人正在搜索它会从这里得到一个很好的解决方案一样。
    【解决方案2】:

    除了answer 错字之外,answers 数组至少需要一个元素才能通过控制器中的错误检查。测试用例不会断言 200。

    在测试用例中添加一个值:

    $this->session(['answers' => array('something')]);
    

    或者换个控制器:

    if (!Session::has('answers')) {
    

    【讨论】:

    • 感谢您的回答。因为在测试时永远不会触及主要的现有代码,所以我在测试功能中对其进行了更改。现在它运行良好。
    猜你喜欢
    • 1970-01-01
    • 2016-02-02
    • 2018-03-20
    • 2015-10-09
    • 2011-08-20
    • 2014-02-14
    • 1970-01-01
    • 2013-05-28
    • 2012-01-19
    相关资源
    最近更新 更多