1

ViewController 内のいくつかのコードをテストし (特定の UISwitches の状態に応じて特定のコントロールがアクティブになるなど)、他の低レベルのロジック テストに使用しているため、Kiwi を使用することにしました。

私の期待は、次のようなテストを実行することです。

__block AViewController *aVC;

it(@"(tokenTextField) should be hidden if the token switch is set to off", ^{
    lvC.useTokenSwitch.on = false;
    [[theValue(aVC.tokenTextField.hidden) should] equal:theValue(YES)];
});

私の問題は、AViewController の初期化にあります。私がした場合:

aVC = [[AViewController alloc] initWithNibName:@"aViewController" bundle:nil];

コントロールを初期化せずに「AViewController」を取得するため、それぞれを手動で初期化する必要があります。

だから私はこれを行う AViewController を取得しようとしました:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
aVC = [storyboard instantiateViewControllerWithIdentifier:@"AViewController"];

それでも、これによりエラーメッセージが表示されます。

NSInvalidArgumentException "バンドル NSBundle に 'MainStoryboard' という名前のストーリーボードが見つかりませんでした </Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/Developer/usr/bin> )」を上げた

MainStoryboard をテスト ターゲットに含め、[ビルド フェーズ] -> [バンドル リソースのコピー] にも含めましたが、まだ何も含まれていません。

Kiwi Testing Target の Storyboard から ViewController をインスタンス化することさえ可能かどうか疑問に思っていますか? (どこにも例を見たことがないので)。

私のアプローチは間違っていますか? ViewController をモックする必要がありますか?

テスト対象に含まれるものが不足していますか?

4

2 に答える 2

0

コントロールが初期化されていない「AViewController」

これらすべてのコントロールの初期化はビューに属しているため、[viewController loadView] を呼び出して UI コンポーネントを初期化する必要があります。

また、viewDidLoad 関数を使用して UI コンポーネントを初期化する場合は、[viewController ビュー] を呼び出して viewDidLoad 関数をトリガーする必要があります。

于 2015-03-30T03:58:25.037 に答える
0

nil問題は、バンドルを渡していることです。エラー メッセージで、使用しているバンドルを確認できます。単体テストでは、おそらく次のようなことをしたいと思うでしょう:

Class viewControllerClass = [myViewController class];

NSString *className = NSStringFromClass(viewControllerClass);
NSBundle *classBundle = [NSBundle bundleForClass:viewControllerClass];

MyViewController *viewController =
[[MyViewController alloc] initWithNibName:className
                                   bundle:classBundle];

ビュー コントローラのクラスを含むバンドルを探すことで、その nib ファイルも取得できます。

ストーリーボードの場合、コードは似ています。

Class viewControllerClass = [myViewController class];

NSString *className = NSStringFromClass(viewControllerClass);
NSBundle *classBundle = [NSBundle bundleForClass:viewControllerClass];

UIStoryboard *storyboard =
[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:classBundle];

MyViewController *viewController =
[storyboard instantiateViewControllerWithIdentifier:className];

(これはすべて、nib 名とストーリーボード識別子がクラス名と一致していることを前提としています。一致していない場合は、変更してください。)

于 2013-08-22T15:01:46.777 に答える