数値と日付を文字列に変換するための一連の日付計算と言語規則を開発する一方で、文字列フォーマット メソッドの結果をアサートするテストを作成しています。架空のアサーションは次のようになります。
NSAssert([dateString isEqualToString:@"Three days, until 6:00 PM"], @"Date string should match expectation");
ただし、アプリは複数の言語にローカライズされており、私の仲間の開発者も私とは異なるロケールの出身であるため、デバイスまたはシミュレーターが、テストが作成されているロケールとは異なるロケールに設定されている可能性があります。このようなシナリオでは、の内容は次のdateString
ようになります。
@"Drie dagen, tot 18:00" // the assertion fails
@"Drei Tage, bis 18 Uhr" // the assertion also fails
これは、これらのロケールの正しい日付表記である場合とそうでない場合がありますが、私の質問の部分は、基になるコードが次のように Apple API を使用する場合に、特定のロケールに対してテストを実行できるようにする方法です。
[NSDateFormatter localizedStringFromDate:date
dateStyle:NSDateFormatterNoStyle
timeStyle:NSDateFormatterShortStyle];
次のような内容で、私のアサーションで 2 つ以上の言語を取り上げたいと思います。
[NSSomething actionToSetTheLocaleTo:@"en_US"];
dateString = ...; // the formatting
NSAssert([dateString isEqualToString:@"Three days, until 6:00 PM"], @"match en_US");
[NSSomething actionToSetTheLocaleTo:@"nl_NL"];
dateString = ...; // the formatting
NSAssert([dateString isEqualToString:@"Drie dagen, tot 18:00"], @"match nl_NL");
この効果を達成する方法を誰が知っていますか?
ノート:
- 優先言語を変更しても問題はありません。NSDateFormatter および NSNumberFormatter の動作にも影響を与える必要があります。
- これは単体テストのみを目的としているため、プライベート API を使用することに満足しています。ただし、この投稿に出くわした他の人のために、パブリック API を使用することをお勧めします。
- カスタムロケールをすべての日付または数値フォーマット API に渡すことは最終的な考慮事項かもしれませんが、これらの極端な手段に戻ることを避けるためにこの質問を投稿しています。ただし、これが唯一の解決策であることがわかっている場合は、参照を提供してください。これ以上時間を無駄にしません
トピックに関するリンク: