【问题标题】:codeception laravel seeResponseContainsJson don't matchcodeception laravel seeResponseContainsJson 不匹配
【发布时间】:2014-09-14 23:51:51
【问题描述】:

我已经收到了服务器的回复:

)]}', {"success":0,"errors":{"error":["用户名无效或 密码。"]}}

我无法工作请参阅ResponseContainsJson 我试过了:

public function invalidUserShouldBe200AndJsonTest(AcceptanceTester $I)
    {
        $I->wantTo('To see a 200 status code and a json response');
        $I->sendAjaxPostRequest('/api/v1/signin',array('email'=>'user@users.com','password'=>'user'));
        $I->seeResponseCodeIs('200');
        $I->seeResponseIsJson();
        $I->seeResponseContainsJson(array('errors' => array('error' => array('Invalid username or password.'))));
    }

但我有

我看到响应包含 json {"errors":{"error":["Invalid username or 密码。"]}}

如果响应是一样的

{"success":0,"errors":{"error":["无效的用户名或密码。"]}}

嗯,如果我尝试应该有问题

$I->seeResponseIsJson();
dd($I->grabResponse());

seeResponseIsJson 给我一个绿色条,但 grabResponse 给我 "" :(

我的测试

use \AcceptanceTester;

class SessionControllerCest
{

    public function _before(\AcceptanceTester $I)
    {
        $I->wantTo('Grab the XSRF-TOKEN cookie value');
        $I->amOnPage('/');
        $text = $I->grabTextFrom('body > div > script');
        $chunks1 = explode("\n", trim($text));
        $chunks2 = explode("=", trim($chunks1[1]));
        $cookieValue = rtrim($chunks2[2], ';"');
        $I->setCookie('XSRF-TOKEN',$cookieValue);
        $I->setHeader('X-XSRF-TOKEN',$cookieValue);
    }

    public function _after()
    {
    }

    // tests
    public function invalidUserShouldBe200AndJsonTest(AcceptanceTester $I)
    {
        $I->wantTo('To see a 200 status code and a json response');
        $I->sendAjaxPostRequest('/api/v1/signin',array('email'=>'user@user.com','password'=>'sentryuser'));
        $I->seeCookie('XSRF-TOKEN');
        $I->seeResponseCodeIs('200');
        $I->seeResponseIsJson();// until here green bar
       // dd($I->grabResponse()); // empty string
        //$I->seeResponseContainsJson(array('success' => 0,'errors' => array('error' => array('Invalid username or password.'))));

        $I->seeResponseContains(""); // red bar 
    }
}

由于跨站点请求伪造 (XSRF) 保护,我在 _before 中设置了这样的设置 就像

Route::filter('xhr', function()
{
    if(!Request::ajax()){
        return Response::make('Not Found', 404);
    } 

});

Route::filter('xsrf', function()
{
    if((!isset($_COOKIE['XSRF-TOKEN']) || is_null(Request::header('X-XSRF-TOKEN'))) || ($_COOKIE['XSRF-TOKEN'] !== Request::header('X-XSRF-TOKEN'))){
        return Response::make('Not Found', 404);
    }
});

路线

Route::group(array('prefix' => 'api/v1', 'before' => 'xhr|xsrf'), function() {
    /* Session */
    Route::post('signin', array('as' => 'session.store', 'uses' => 'App\Controllers\SessionController@store'));
});

调试

如果我对 _before 块进行注释,就会出现问题 尝试发送一个 cUrl 请求,例如:

curl -H 'X-Requested-With: XMLHttpRequest' -d "email=user@user.com" \
-d "password=mysentryuser" \
http://lama.io/api/v1/signin

我明白了

{"success":0,"errors":{"error":["用户名或密码无效。"]}}

但是当我运行它时

// tests
    public function invalidUserShouldBe200AndJsonTest(AcceptanceTester $I)
    {
        $I->wantTo('To see a 200 status code and a json response');
        $I->sendAjaxPostRequest('/api/v1/signin',array('email'=>'user@user.com','password'=>'mysentryuser'));
       // $I->seeCookie('XSRF-TOKEN');
        $I->seeResponseCodeIs('200');
       //$I->seeResponseIsJson();// until here green bar
       //dd($I->grabResponse()); // empty string
       $I->seeResponseContainsJson(array('success' => 0,'errors' => array('error' => array('Invalid username or password.'))));

        //$I->seeResponseContains(""); // red bar 
    }

我明白了

我看到响应包含 json {"success":0,"errors":{"error":["Invalid 用户名或密码。"]}}

所以可能有问题,但是什么!

【问题讨论】:

    标签: laravel-4 phpunit codeception


    【解决方案1】:

    您可以按如下方式重写测试的最后一行:

    $I->seeResponseContainsJson(array('success' => 0, 'errors' => array('error' => array('Invalid username or password.'))));
    

    因为那是您的响应包含的 JSON。

    【讨论】:

    • 感谢您的回复,但如果我尝试检查 $I->seeResponseIsJson(); dd($I->grabResponse());我得到一个空字符串:(
    • 您使用的是 Codeception 1.x 还是 Codeception 2.x?
    • 我使用的是 2.x 版本
    • 你能试试grabDataFromJsonResponse 看看是否能给你带来什么好处吗?如果不是,那么您的回复为空。
    • 给我一个错误,但正如我在第一条评论中指出的那样,grabResponse 给我一个空字符串,但是如果我尝试将 ie exit('Help me') 放在控制器操作中,它是一样的。 .
    猜你喜欢
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 2019-07-01
    • 2016-10-24
    • 2020-07-08
    • 2017-05-06
    • 2016-12-10
    • 2016-09-20
    相关资源
    最近更新 更多