我是" iOS" 的初学者,从这个问题中可以清楚看到!!我正在为 iOS 应用编写单元测试。我正在尝试从测试类设置UITextField
。每次我从测试用例设置用户名 textfield
文字时,都会返回null
。我不能这样做吗?我真的不想更改控制器类中的代码进行测试!
所有在线示例都创建了一个类的实例,并设置了如下所示的文本,除了使用@synthesize
(我认为" iOS7" ),为什么它会返回null
?
Controller.h
中的代码:
@property (nonatomic, retain) IBOutlet UITextField *username;
测试用例类:
SignUpViewController *viewController = [[SignUpViewController alloc]init];
viewController.username.text = @"username@example.com";
username.text =null
答案 0 :(得分:3)
由于您的媒体资源是使用IBOutlet
宣传的,因此我假设您正在使用故事板来查看视图。如果是这种情况,那么textField的文本不是nil的问题,这是整个textField为nil的问题。
当从故事板加载视图控制器时,所有IBOutlet(如果它们正确连接)都会为您初始化。运行单元测试时,没有与故事板的交互,因此不会初始化textField。
要解决此问题,您可以自己创建并分配textField:
SignUpViewController *viewController = [[SignUpViewController alloc]init];
viewController.username = [[UITextField alloc] init];
viewController.username.text = @"username@example.com";
或者,更好的是,您可以查看OCMock,并在单元测试中创建并指定模拟文本字段。
答案 1 :(得分:1)
您需要先加载视图。
SignUpViewController *viewController = [[SignUpViewController alloc]init];
[viewController view]; // !!
viewController.username.text = @"username@example.com";
答案 2 :(得分:0)
仅仅因为属性存在,并不意味着已经创建了支持它的实例变量。该特定UITextField
是对从NIB文件加载的对象的引用(请参阅IBOutlet
属性),因此您可能希望使用以下命令初始化视图控制器:
NSString *nibname = @"SignUpViewController"; // JUST GUESSING!
SignUpViewController *viewController = [[SignUpViewController alloc] initWithNibName:nibname
bundle:nil];
答案 3 :(得分:0)
要解决此问题,您可以通过编写以下内容在单元测试类中自己创建和分配视图控制器的视图: let _ = self.mockSubject.view
这里的mockSubject是viewController。