iOS 单元测试按钮已分配 Action

标签 ios unit-testing

我以编程方式编写了以下按钮:

self.button = [[UIButton alloc] init];
[self.button setTitle:@"Reverse String!" forState:UIControlStateNormal];
self.button.backgroundColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1.0];
self.button.layer.cornerRadius = 5.0;
[self.button addTarget:self action:@selector(reverseString:) forControlEvents:UIControlEventTouchUpInside];

但是,当我尝试测试时,我的单元测试失败了:

-(void)testButtonActionAssigned
{
    XCTAssert([self.vc.button respondsToSelector:@selector(reverseString:)]);
}

我收到一条失败消息:

test failure: -[ViewControllerTests testButtonActionAssigned] failed: (([self.vc.button respondsToSelector:@selector(reverseString:)]) is true) failed

我的设置方法被称为:

- (void)setUp {
    [super setUp];
    // Put setup code here. This method is called before the invocation of each test method in the class.
    self.vc = [[ViewController alloc] init];

    NSLog(@"THIS METHOD IS CALLED");
}

这与模拟器计时和启动有关吗?

最佳答案

[self.button addTarget:self action:@selector(reverseString:) forControlEvents:UIControlEventTouchUpInside];   

第一行意味着 reverseString: 方法应该在你的 ViewController 中(由 target: 参数指定,你传递 self 那里)。因此,您需要通过删除 .button

来更改测试
 -(void)testButtonActionAssigned
    {
        XCTAssert([self.vc respondsToSelector:@selector(reverseString:)]);
    }

这是一个可以改变的小例子:

UIButton *button = [UIButton new];
[button addTarget:self action:@selector(doThat:) forControlEvents:UIControlEventTouchUpInside];

NSString *selectorString = [[button actionsForTarget:self forControlEvent:UIControlEventTouchUpInside] firstObject];

SEL sel = NSSelectorFromString(selectorString);

// so now you can check if target responds to selector
// BOOL responds = [self respondsToSelector:sel];

NSLog(@"%@", selectorString);

关于iOS 单元测试按钮已分配 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34221688/

相关文章:

ios - 在TableView中实现多个PickerView

iphone - 使用 NSURL 访问本地文件

ios - 静态单元格在 Interface Builder 中显示为空(运行 XCode 7.1)

ios - 当 switch case 的默认 block 只有 id 调试行时,我的程序会在生产中崩溃吗

java - junit.framework.AssertionFailedError 并且由于空格而没有可运行的方法

java - 如何在 Mockito 中编写 if-else 测试用例

ios - 核心数据扩展 : insert NSManagedObject in NSManagedObjectContext

javascript - jasmine需要sinon.js吗?

javascript - Javascript 中的 setInterval 函数单元测试问题

java - Aerospike 的单元测试