为 UIView 框架编写单元测试

Posted

技术标签:

【中文标题】为 UIView 框架编写单元测试【英文标题】:Write Unit Test for UIView frame 【发布时间】:2014-04-02 17:19:48 【问题描述】:

我正在移动我的 UIView 的框架,具体取决于实际的 UIKeyboardState(显示/隐藏)。 现在我想为此编写一个单元测试 (XCTest)。基本上,无论何时显示键盘,我都想检查UIView 的框架。

这是我用于移动UIView 的代码,这些方法通过我在viewWillAppear 中注册的NSNotification 触发:

- (void)keyboardWillShow:(NSNotification *)notification

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
    [self.view setFrame:CGRectMake(0, -kOFFSET_FOR_KEYBOARD, self.view.frame.size.width, self.view.frame.size.height)];
    [UIView commitAnimations];


- (void)keyboardWillHide:(NSNotification *)notification

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
    [self.view setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    [UIView commitAnimations];

知道单元测试的样子吗?我对单元测试很陌生,这就是我问的原因。

【问题讨论】:

【参考方案1】:

这是测试此功能的基本测试用例。你应该用你的VC类替换UIViewController。也不建议直接调用-viewWillAppear:,但是在这个具体的单元测试的情况下就可以了。

-(void)testKeyboardShown

    UIViewController* controller = [[UIViewController alloc] init];

    [controller viewWillAppear:YES];

    [[NSNotificationCenter defaultCenter] postNotificationName:UIKeyboardWillShowNotification object:nil];

    XCTAssertEqual(controller.view.frame.origin.y, -kOFFSET_FOR_KEYBOARD, "View should move up");

    [[NSNotificationCenter defaultCenter] postNotificationName:UIKeyboardWillHideNotification object:nil];

    XCTAssertEqual(controller.view.frame.origin.y, 0, "View should move down");

奖励: UIKeyboardWillShowNotification 的 userInfo 字典包含一个告诉你键盘高度的属性;你可以使用这个值而不是硬编码你自己的偏移量。它还包括动画持续时间和时序曲线的值,因此您的动画可以更正确地跟随键盘的动画,而不是硬编码 0.3 秒。

编辑

要测试动态键盘高度,您需要传递一个带有 UIKeyboardWillShowNotification 的 userInfo 字典,其中包含一个假的键盘框架:

CGRect keyboardFrame = CGRectMake(0, 0, 0, 20);

[[NSNotificationCenter defaultCenter] postNotificationName:UIKeyboardWillShowNotification object:nil userInfo:@ UIKeyboardFrameBeginUserInfoKey : [NSValue valueWithCGRect:keyboardFrame] ];

XCTAssertEqual(controller.view.frame.origin.y, -keyboardFrame.size.height, "View should move up");

【讨论】:

好的,谢谢,但是如果我使用 userInfo Dictionary 中的信息,那么我将如何在我的测试中检索这些信息?

以上是关于为 UIView 框架编写单元测试的主要内容,如果未能解决你的问题,请参考以下文章

Vala 的单元测试框架

#单元测试#以karma+mocha+chai 为测试框架的Vue webpack项目

爬虫日记(106):Twisted:单元测试怎么样编写

单元测试 UILocalNotification

一文让你快速上手 Mockito 单元测试框架

一文让你快速上手 Mockito 单元测试框架