۰ پویا پارسایی
نحوه تست ستون json در متد seeInDatabase
جامعه پی اچ پی ایجاد شده در ۱۸ اردیبهشت ۱۴۰۱

سلام و عرض ادب

واسه مسئله آخر جلسه که بین کلید‌ها و مقادیر answers فاصله اضافی ایجاد میشد و SeeInDatabase خطا میخورد، از این روش استفاده کردم:

۱ - ساخت کلاس JsonUtilty در مسیر app/Utilities و تعریف متد داخلش:



namespace App\\Utilities;
class JsonUtility
{
    public static function removeSpacesAndCastToJson($json)
    {
        $json = json_encode($json);
        return \\DB::raw("CAST('{$json}' AS JSON)");
    }
}

۲- داخل seeInDatabase هم به این صورت ازش استفاده میکنیم:


namespace Tests\\Api\\V1\\AnswerSheets;
use App\\Consts\\AnswerSheetStatus;
use App\\Utilities\\JsonUtility;
use Hekmatinasser\\Verta\\Verta;
use Laravel\\Lumen\\Testing\\DatabaseMigrations;
use Tests\\Api\\Contracts\\Faker;
use Tests\\Api\\Contracts\\QuestionMaker;
use Tests\\TestCase;
class AnswerSheetTest extends TestCase
{
    use DatabaseMigrations, Faker, QuestionMaker;
    public function test_ensure_can_create_answer_sheet()
    {
        $quiz = $this->createQuiz()[0];
        $jalaliDate = Verta::now();
        $answerSheetData = [
            'quiz_id' => $quiz->getId(),
            'answers' => json_encode([
                1 => 4,
                2 => 2,
                3 => 3,
                4 => 5,
            ]),
            'status' => array_rand([AnswerSheetStatus::REJECTED, AnswerSheetStatus::PASSED]),
            'score' => array_rand([NULL, random_int(1, 20)]),
            'finished_at' => $jalaliDate->format('Y/m/j H:i:s')
        ];
        $response = $this->call('post', 'api/v1/answer-sheets', $answerSheetData);
        $returnedData = json_decode($response->getContent(), true)['data'];
        $this->assertEquals(201, $response->getStatusCode());
        $this->seeInDatabase('answer_sheets', [
            'id' => $returnedData['id'],
            'quiz_id' => $answerSheetData['quiz_id'],
            'answers' => JsonUtility::removeSpacesAndCastToJson($returnedData['answers']),/*<=Inja*/
            'status' => $answerSheetData['status'],
            'score' => $answerSheetData['score'],
            'finished_at' => $jalaliDate->toCarbon()->toDateTimeString(),
        ]);
        $this->assertEquals($answerSheetData['quiz_id'], $returnedData['quiz_id']);
        $this->assertEquals(json_decode($answerSheetData['answers'], true), $returnedData['answers']);
        $this->assertEquals($answerSheetData['status'], $returnedData['status']);
        $this->assertEquals($answerSheetData['score'], $returnedData['score']);
        $this->assertEquals($answerSheetData['finished_at'], $returnedData['finished_at']);
        $this->seeJsonStructure([
            'success',
            'message',
            'data' => [
                'quiz_id',
                'answers',
                'status',
                'score',
                'finished_at'
            ]
        ]);
    }
}

امیدوارم براتون کاربردی باشه.