1

OCUnit と OCMock を使ったちょっとしたクラッシュ コースの後、質問をしなければなりません。多分それは簡単なことですが、私はそれを理解することができません。

この小さな小さな方法では:

- (void)setLoginButtonTitleForState:(BOOL)isLoggedIn {

if (isLoggedIn) {

    [_loginButton setTitle:@"Logout" forState:UIControlStateNormal];
}
else {
    [_loginButton setTitle:@"Login" forState:UIControlStateNormal];
}

}

タイトル ラベルが正しく入力されているかどうかをテストしたい。そのような場合のテストの書き方を学んでいるので、テストを書く前にメソッドを書きました。しかし、とにかくテストを実装する必要があります。

以前にこれを行ったことがある人がいる場合は、私を助けてください。これは私がこれまでに行ったことです:

- (void)test_checkLoginAndSetLoginButtonAndTitle_loggedIn {
    MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
    id mock_vc = [OCMockObject partialMockForObject:myViewController];


    UIButton *loginButton = [[UIButton alloc] init];
    id mock_button = [OCMockObject partialMockForObject:loginButton];

    [mock_vc setLoginButton:mock_button];

    [[mock_vc expect] setLoginButtonTitleForState:YES];

    [[mock_button expect] setTitle:@"Logout" forState:UIControlStateNormal];

    [mock_vc verify];
}

質問は次のとおりです。ここで何が間違っていますか?

ところで:テストを実行すると、次のエラーが発生します:

/Unknown.m: OCPartialMockObject[MyViewController]: expected method was not invoked: setLoginButtonTitleForState:YES

メソッドはパブリックでアクセス可能であるため、メソッドを呼び出さない理由がわかりません。

誰かが私にヒントを持っているなら、私に知らせてください!

4

2 に答える 2

3

したがって、これは to test に関するあなたの質問に直接答えないかもしれません[UIButton setTitle:forState:]が、ストック Apple API をテストするべきではないことを提出します。ログイン ボタンのタイトルを設定するロジックをテストするには、実際に変更して、別のメソッドでボタンのタイトルを設定する文字列を返すようにします。これが私が意味することです:

- (void)setLoginButtonTitleForState:(BOOL)isLoggedIn {
  [_loginButton setTitle:[self buttonTitleForLoggedIn:isLoggedIn] forState:UIControlStateNormal];
}

- (NSString *)buttonTitleForLoggedIn:(BOOL)loggedIn {
  return (loggedIn) ? @"Logout" : @"Login";
}

テストは次のようになります。

- (void)test_checkLoginAndSetLoginButtonAndTitle_loggedIn {
    MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
    STAssertEqualObjects([myViewController buttonTitleForLoggedIn:YES], @"Logout", @"After logging in, the 'login' button's title should be set to logout");
}
于 2013-09-09T13:25:29.590 に答える