为 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 框架编写单元测试的主要内容,如果未能解决你的问题,请参考以下文章