16

ローカライズされた文字列を使用するiPhoneiOS4.1アプリケーションがあります。SenTestingKitを使用して単体テストの構築を開始しました。私は多くの異なるタイプの値を正常にテストすることができました。

NSLocalizedString呼び出しを使用するコードを正しくテストできません。これは、コードがLogicTestsターゲットで実行されると、すべてのNSLocalizedString呼び出しが文字列キーのみを返すためです。

Localizable.stringsファイルをLogicTestsターゲットに追加しました。

私の質問は、NSLocalizedStringを呼び出すと、文字列キーではなくローカライズされた文字列が返されるように、LogicTestsターゲットをどのように構成する必要があるかです。

4

7 に答える 7

10

この問題は私を夢中にさせていましたが、私はNSLocalizedString振る舞うことができました.

ロジック テストで mainBundle をコンソールに出力すると、Localizable.strings ファイルを含むバンドルとは異なります。NSLocalizedString単体テストを実行するたびに、条件付きで再定義する必要があります。次の手順で行いました。

  1. ロジック テスト ターゲットにいることを伝える方法が必要なので、ロジック テスト ターゲットのPreprocessor Macrosビルド設定に LOGIC_TESTS のようなものを追加します。
  2. 私のコードには を再定義する必要がある場所が 1 か所しかないNSLocalizedStringため、そのクラスに対応するヘッダーに次のコードを配置することができました。複数の場所でこの問題が発生している場合は、次のコードをヘッダーに配置し、#include必要な場所に -ing することをお勧めします (.pch ファイルを使用してみましたが、Logic Tests では機能しません)。とにかく、これを使用するクラスのヘッダーのどこかに配置しますNSLocalizedString:

    #ifdef LOGIC_TESTS
    #undef NSLocalizedString
    #define NSLocalizedString(key, comment) [[NSBundle bundleWithIdentifier:@"YOUR_IDENTIFIER"] localizedStringForKey:(key) value:@"" table:nil]
    #endif
    

YOUR_IDENTIFIERアプリのバンドルのバンドル識別子に置き換えます (Info.plistファイル内にあり、キーは ですCFBundleIdentifier)。これは、Logic Tests ターゲットでのみLOGIC_TESTSプリプロセッサ マクロとして定義したことを前提としています。

編集:不思議なことに、デバッグコードを削除すると、このソリューションは機能しなくなりました。Xcode をだましてバンドルをロードする必要があるようです。次のようにします。

NSString *path = @"path_to_main_bundle";
NSBundle *bundle = [NSBundle bundleWithPath:path];
NSLog(@"bundles: %@", [NSBundle allBundles]);

メインターゲットを実行するときはどこですかpath_to_main_bundle== [[NSBundle mainBundle] bundlePath]gdb に 1 回記録するかNSLog、アプリのデリゲートで使用してパスを取得するだけです。のようになります/Users/YOUR_USER_NAME/Library/Application Support/iPhone Simulator/4.1/Applications/UUID_LOTS_OF_LETTERS_AND_NUMBERS_HERE/App.app

そのコードを、ロジック テスト クラスの 1 つの setUp 呼び出しに配置しました。いいえ、すべてのバンドルをログに記録して機能させる必要がある理由がわかりません。手がかりがある人は教えてください!

于 2010-10-11T18:59:49.497 に答える
7

単体テストのセットアップで次のコードを使用してNSLocalizedStringを使用できました

- (void)setUp
{
    [super setUp];

    NSString *bundlePath = [[NSBundle bundleForClass:[self class]] resourcePath];
    [NSBundle bundleWithPath:bundlePath];
}
于 2012-06-07T00:00:56.990 に答える
4

同じ問題が発生しました。@kevboth に感謝します。YourUnitTests-Prefix.pchに 2 行を追加して対処します。

#undef NSLocalizedString
#define NSLocalizedString(key, comment) [[NSBundle bundleForClass:[self class]] localizedStringForKey:(key) value:@"" table:nil]
于 2012-04-10T07:19:41.000 に答える
2

Swift のショートカット: これは単純なバージョンであり、さまざまなユース ケース (tableName の使用など) に拡張できます。

public func NSLocalizedString(key: String, referenceClass:AnyClass) -> String 
{
    let bundle = NSBundle(forClass: referenceClass)
    return NSLocalizedString(key, tableName:nil, bundle: bundle, comment: "")
}

このグローバル メソッドは、単一の .swift ファイルまたはクラス スコープ外の別の場所に配置できます。次のように使用します。

NSLocalizedString("YOUR-KEY", referenceClass: self)
于 2016-01-18T09:58:02.593 に答える
1

たぶんNSLocalizedString、アプリケーションテスト内でのみ機能しますか?localizedStringForKey:value:table:これは、メインバンドルで呼び出すマクロです。たぶん+[NSBundle mainBundle]、テストターゲットで何か気の利いたものを返しますか?

于 2010-10-10T07:20:04.087 に答える
0

最もクリーンな解決策はLocalizable.strings、octest バンドルに a を含めることです。

于 2012-08-31T20:14:02.847 に答える