Рубрики
Uncategorized

Многобайтовое тестирование текста и Laravel

Проблема Когда я писал тестовый код в Laravel, я столкнулся с проблемой. Мой API возвращает несколько… С тегами laravel, php, тестирование, китайский.

Когда я писал тестовый код в Laravel, я столкнулся с проблемой.

Мой API возвращает многобайтовый текст. По умолчанию PHP json_encode экранирует многобайтовый текст, поэтому мой API возвращает следующее:

curl localhost:8000/api/post/1

# Expected
{"title":"日本語"}

# Actual
{"title":"\u65e5\u672c\u8a9e"}

Laravel $response->assertSeeText('яп.本') не работает, потому что он сравнивает строку, декодированную в формате UTF-8.

Этот тест проходит:

 '太郎',
            'gender' => 'male',
        ]);
        $this->assertDatabaseHas('users', [
            'name' => '太郎',
            'gender' => 'male',
        ]);
    }
}

(ЗАДАЧА: В моем случае я ожидал, что этот тест провалится… но прошло.)

Этот тест, возвращающий API JSON, завершается неудачей:

 '太郎',
            'sex' => 'male',
        ]);
        $this->actingAs($user)
            ->get('/api/me')
            ->assertSeeText('太郎');
    }
}

Сообщает о следующей ошибке:

1) UserTest::testCanCreateUser
Failed asserting that '{"name":"\u592a\u90ce","sex":"male"}' contains "太郎".

Конечно, текст “太郎” экранирован.

Просто подтвердите результат, используя json_encode .

actingAs($user)
            ->get('/api/me')
            ->assertSeeText(json_encode('太郎'));
// ...

Вы можете задаться вопросом, почему я не использую utf8_encode , но в моем случае это не удалось. Может быть, это зависит от php.ini .

Есть и другие неудачные случаи, связанные с многобайтовым, в моем случае при написании тестирования OAuth с использованием макетного объекта. Тогда вы можете попробовать e('太郎') . Моя проблема была решена этим.

Мы можем избежать использования многобайтовых строк при тестировании, но иногда нам необходимо протестировать такие строки.

Я исследовал множество веб-сайтов, в том числе китайские сайты, такие как 思否/| , наконец-то найденный в переполнении стека, как обычно.

思否/| , наконец-то найденный в переполнении стека, как обычно.

Я иногда сталкиваюсь с китайскими статьями при решении этих многобайтовых проблем. Я не могу понять точно, но по иероглифам я могу догадаться, что они говорят.

Оригинал: “https://dev.to/acro5piano/multibyte-text-and-laravel-testing-3k1l”