У меня проблемы с модульным тестированием библиотеки, использующей NumberFormatter::formatCurrency. После некоторых проб и ошибок я сузил проблему до этого тестового случая:
/**
* @dataProvider getLocales()
*/
public function test($locale, $expected)
{
$number_formatter = new \NumberFormatter($locale, \NumberFormatter::CURRENCY);
$actual = $number_formatter->formatCurrency(3000.05, 'EUR');
$this->assertEquals($expected, $actual, $locale.' failed');
}
public function getLocales()
{
return array(
array('en_US', '€3,000.05'),
array('fr_FR', '3 000,05 €'),
array('de_DE', '3.000,05 €'),
);
}
Результаты:
fr_FR failed
Failed asserting that two strings are equal.
Expected :3 000,05 €
Actual :3 000,05 €
de_DE failed
Failed asserting that two strings are equal.
Expected :3.000,05 €
Actual :3.000,05 €
Как видите, неудавшиеся тесты имеют идентичные строки, поэтому проблема должна заключаться в локали.
Я пытался сравнить с strcoll, установить локаль перед сравнением и другие комбинации, но безуспешно.
Я предполагаю, что это как-то связано с разными кодами utf-8 на каждом языке. Но как тогда я могу сравнить эти строки?
NumberFormatter::formatCurrency()
фактически возвращает строку со скрытыми символами, поэтому они кажутся одинаковыми, но на самом деле имеют разную длину строки. Я смог выяснить это, пропустив ожидаемые и фактические результаты черезutf8encode
. К сожалению, я еще не смог найти чистое решение. Вам когда-нибудь удавалось придумать что-нибудь? - person Graham S.   schedule 02.03.2017