Когда я писал тестовый код в 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”