3

我有一个简单的 if 条件,当满足时,添加一个目标以在点击“完成”时放下键盘

- (void)addDoneWhenTrue:(UITextField *)input
{
    if (YES)
    {
        [input addTarget:self action:@selector(textFieldFinished:) forControlEvents:UIControlEventEditingDidEndOnExit];
    }
}

- (IBAction)textFieldFinished:(id)sender
{
    [sender resignFirstResponder];
}

我在 iOS5 上使用 OCMock 和 OCUnit。如何创建一个单元测试,允许我传递一个简单的UITextField输入并模拟点击它上的完成按钮以验证resignFirstResponder是否发生(或不发生)?

4

2 回答 2

2

您不需要嘲笑它,这种目标/行动方法感觉就像是一种真正迂回的方式来获得您想要的东西。只要您的控制器是UITextField的委托,textFieldShouldReturn:就会在点击 Return(或在本例中为 Done)键时触发。

#pragma mark - UITextFieldDelegate

-(void)textFieldShouldReturn:(UITextField *)textField {
    if (someConditionThatDeterminesWhetherKeyboardShouldCollapse) {
        [textField resignFirstResponder];
    }
}

textFieldShouldReturn:然后,您可以在满足和不满足条件时测试对控制器的调用。如果需要,您还可以通过调用确保您的视图已加载到测试用例中loadView,然后断言文本字段的委托是您的控制器,这将确保视图正确连接。

-(void)testDoneShouldCollapseKeyboard {
    [controller loadView];
    expect(controller.textField.delegate).to.beIdenticalTo(controller);

    id mockTextField = [OCMockObject partialMockForObject:controller.textField];
    [[mockTextField expect] resignFirstResponder];
    controller.someConditionThatDeterminesWhetherKeyboardShouldCollapse = YES;

    [controller textFieldShouldReturn:controller.textField];

    [mockTextField verify];

    [[mockTextField reject] resignFirstResponder];
    controller.someConditionThatDeterminesWhetherKeyboardShouldCollapse = NO;

    [controller textFieldShouldReturn:controller.textField];

    [mockTextField verify];
}
于 2012-08-21T04:43:16.333 回答
0

当然,您不需要模拟单击按钮,因为这就是UIKit您所关心的。您担心当textFieldFinished:调用该方法时会发生正确的事情

免责声明

我已经OCMock很长时间没有使用了,所以这是一个仅使用文档的示例,因此它很容易有点不正确-希望有人可以纠正OCMock所有设置的人。

id mock = [OCMockObject mockForClass:[UITextField class]];

[[mock expect] resignFirstResponder];

[sut textFieldFinished:mock]; // sut = system under test - taken from your screen cast ;)

[mock verify];
于 2012-08-20T09:05:42.410 回答