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 回答
2

不要过度嘲笑一切。为什么不检查是否设置了正确的字符串?这才是你真正关心的,对吧(最终结果,而不是你如何到达那里)?

您可以从按钮获取标签并将其与预期值进行比较titleForState:

NSString *actual = [loginButton titleForState:UIControlStateNormal];
STAssertEqualObjects(actual, @"Logout", @"The button should say 'Logout' by now");
于 2013-09-09T13:22:08.683 回答