ViewControllerTests.m 5.79 KB
//
//  ViewControllerTests.m
//  YH_Analytics
//
//  Created by Zhou Rongjun on 15/4/29.
//  Copyright (c) 2015年 YOHO. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <XCTest/XCTest.h>

#import "ViewController.h"
#import "YH_Analytics.h"
//#import "YHCrashReporter.h"

@interface ViewControllerTests : XCTestCase {
@private
    ViewController *vc;
    id analyticsMock;
}

@end

@implementation ViewControllerTests

- (void)setUp {
    [super setUp];
    // Put setup code here. This method is called before the invocation of each test method in the class.
    NSLog(@"%@ setUp", self.name);
    analyticsMock = OCMClassMock([YH_Analytics class]);
    XCTAssertNotNil(analyticsMock, @"Cannot create YH_Analytics mock");
    
    OCMStub([analyticsMock sharedInstance]).andReturn(analyticsMock);
    
    // 从storyboard中获取一个viewcontrol
    UIStoryboard *s = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    vc = [s instantiateViewControllerWithIdentifier:NSStringFromClass([ViewController class])];
    
    [vc view];
}

- (void)tearDown {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    analyticsMock = nil;
    vc = nil;
    
    [super tearDown];
    NSLog(@"%@ tearDown", self.name);
}

#pragma mark - 验证UI是否存在

- (void)testEventButtonShouldBeConnected {
    NSLog(@"%@ start", self.name);
    
    XCTAssertNotNil([vc eventButton], @"eventButton should be connected.");
    
    NSLog(@"%@ end", self.name);
}

- (void)testErrorButtonShouldBeConnected {
    NSLog(@"%@ start", self.name);
    
    XCTAssertNotNil([vc errorButton], @"errorButton should be connected.");
    
    NSLog(@"%@ end", self.name);
}

- (void)testCrashButtonShouldBeConnected {
    NSLog(@"%@ start", self.name);
    
    XCTAssertNotNil([vc crashButton], @"crashButton should be connected.");
    
    NSLog(@"%@ end", self.name);
}

- (void)testSegmentShouldBeConnected {
    NSLog(@"%@ start", self.name);
    
    XCTAssertNotNil([vc segment], @"segment should be connected.");
    
    NSLog(@"%@ end", self.name);
}

#pragma mark - 验证UI触发的事件是否正确

- (void)testEventButtonAction {
    NSLog(@"%@ start", self.name);
    
    UIButton *button = [vc eventButton];
    NSArray *selectorArray = [button actionsForTarget:vc forControlEvent:UIControlEventTouchUpInside];
    
    XCTAssert([selectorArray containsObject:@"handleEventButtonClick:"]);
    
    NSLog(@"%@ end", self.name);
}

- (void)testErrorButtonAction {
    NSLog(@"%@ start", self.name);
    
    UIButton *button = [vc errorButton];
    NSArray *selectorArray = [button actionsForTarget:vc forControlEvent:UIControlEventTouchUpInside];
    
    XCTAssert([selectorArray containsObject:@"handleErrorButtonClick:"]);
    
    NSLog(@"%@ end", self.name);
}

- (void)testCrashButtonAction {
    NSLog(@"%@ start", self.name);
    
    UIButton *button = [vc crashButton];
    NSArray *selectorArray = [button actionsForTarget:vc forControlEvent:UIControlEventTouchUpInside];
    
    XCTAssert([selectorArray containsObject:@"handleCrashButtonClick:"]);
    
    NSLog(@"%@ end", self.name);
}

- (void)testSegmentControlAction {
    NSLog(@"%@ start", self.name);
    
    UISegmentedControl *segment = [vc segment];
    NSArray *selectorArray = [segment actionsForTarget:vc forControlEvent:UIControlEventValueChanged];
    
    XCTAssert([selectorArray containsObject:@"handleSegmentClick:"]);
    
    NSLog(@"%@ end", self.name);
}

#pragma mark - 验证UI触发事件后,是否达到预期效果

- (void)testEventButtonResult {
    NSLog(@"%@ start", self.name);
    
    OCMExpect([analyticsMock logEvent:[OCMArg any] parameters:[OCMArg any]]);
    
    [vc.eventButton sendActionsForControlEvents: UIControlEventTouchUpInside];
    
    OCMVerifyAll(analyticsMock);
    
    NSLog(@"%@ end", self.name);
}

- (void)testErrorButtonResult {
    NSLog(@"%@ start", self.name);
    
    OCMExpect([analyticsMock logError:[OCMArg any] parameters:[OCMArg any]]);
    
    [vc.errorButton sendActionsForControlEvents: UIControlEventTouchUpInside];
    
    OCMVerifyAll(analyticsMock);
    
    NSLog(@"%@ end", self.name);
}

- (void)testCrashButtonResult {
    NSLog(@"%@ start", self.name);
    
//    YHCrashReporter *crashReporter = [[YHCrashReporter alloc] init];
//    id crashMock = OCMPartialMock(crashReporter);
//    
//    OCMExpect([crashMock handleNSException:[OCMArg any]]);
    
    XCTAssertThrows([vc.crashButton sendActionsForControlEvents: UIControlEventTouchUpInside]);
    
//    OCMVerifyAll(crashMock);
//    
//    crashMock = nil;
//    crashReporter = nil;
    
    NSLog(@"%@ end", self.name);
}

- (void)testSegmentControlFirstResult {
    NSLog(@"%@ start", self.name);
    
    OCMExpect([analyticsMock updateLogStrategy:LogStrategyAppLaunch customInterval:0]);
    
    UISegmentedControl *segment = [vc segment];
    segment.selectedSegmentIndex = 0;
    [segment sendActionsForControlEvents: UIControlEventValueChanged];
    
    OCMVerifyAll(analyticsMock);
    
    NSLog(@"%@ end", self.name);
}

- (void)testSegmentControlSecondResult {
    NSLog(@"%@ start", self.name);
    
    OCMExpect([analyticsMock updateLogStrategy:LogStrategyCustom customInterval:1000]);
    
    UISegmentedControl *segment = [vc segment];
    segment.selectedSegmentIndex = 1;
    [segment sendActionsForControlEvents: UIControlEventValueChanged];
    
    OCMVerifyAll(analyticsMock);
    
    NSLog(@"%@ end", self.name);
}

- (void)testSegmentControlThirdResult {
    NSLog(@"%@ start", self.name);
    
    OCMExpect([analyticsMock updateLogStrategy:LogStrategyImmedi customInterval:0]);
    
    UISegmentedControl *segment = [vc segment];
    segment.selectedSegmentIndex = 2;
    [segment sendActionsForControlEvents: UIControlEventValueChanged];
    
    OCMVerifyAll(analyticsMock);
    
    NSLog(@"%@ end", self.name);
}
@end