Authored by 周蓉君

Merge branch 'beardev'

... ... @@ -31,6 +31,7 @@
CA7AC7A01ADE0C4F00F30791 /* YHEventFactoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC79F1ADE0C4F00F30791 /* YHEventFactoryTests.m */; };
CA7AC7A21ADE0C6600F30791 /* YHStatusFactoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7A11ADE0C6600F30791 /* YHStatusFactoryTests.m */; };
CA7AC7A41ADF9FCB00F30791 /* YH_AnalyticsLogicTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7A31ADF9FCB00F30791 /* YH_AnalyticsLogicTests.m */; };
CAA6BD371AE4E857006C3332 /* FakeLocationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CAA6BD361AE4E857006C3332 /* FakeLocationManager.m */; };
CABC32831AD7CEB8002A4260 /* libOCMock.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CABC32821AD7CEB8002A4260 /* libOCMock.a */; };
E74D45B21ABA7C6300EFE12E /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E74D458E1ABA7C6300EFE12E /* AFHTTPRequestOperation.m */; };
E74D45B31ABA7C6300EFE12E /* AFHTTPRequestOperationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E74D45901ABA7C6300EFE12E /* AFHTTPRequestOperationManager.m */; };
... ... @@ -128,6 +129,8 @@
CA7AC79F1ADE0C4F00F30791 /* YHEventFactoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHEventFactoryTests.m; sourceTree = "<group>"; };
CA7AC7A11ADE0C6600F30791 /* YHStatusFactoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHStatusFactoryTests.m; sourceTree = "<group>"; };
CA7AC7A31ADF9FCB00F30791 /* YH_AnalyticsLogicTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YH_AnalyticsLogicTests.m; sourceTree = "<group>"; };
CAA6BD351AE4E857006C3332 /* FakeLocationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FakeLocationManager.h; sourceTree = "<group>"; };
CAA6BD361AE4E857006C3332 /* FakeLocationManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FakeLocationManager.m; sourceTree = "<group>"; };
CABC32791AD7CE40002A4260 /* NSNotificationCenter+OCMAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSNotificationCenter+OCMAdditions.h"; sourceTree = "<group>"; };
CABC327A1AD7CE40002A4260 /* OCMArg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMArg.h; sourceTree = "<group>"; };
CABC327B1AD7CE40002A4260 /* OCMConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMConstraint.h; sourceTree = "<group>"; };
... ... @@ -289,6 +292,7 @@
194EDC8C1A7F52D100421E6C /* YH_AnalyticsTests */ = {
isa = PBXGroup;
children = (
CAA6BD381AE4E85D006C3332 /* FakeClass */,
CA7AC7981ADE092D00F30791 /* Factory */,
CA7AC78D1ADE08AF00F30791 /* ModelTest */,
CA7AC78C1ADE088D00F30791 /* UtilsTest */,
... ... @@ -360,6 +364,15 @@
name = Factory;
sourceTree = "<group>";
};
CAA6BD381AE4E85D006C3332 /* FakeClass */ = {
isa = PBXGroup;
children = (
CAA6BD351AE4E857006C3332 /* FakeLocationManager.h */,
CAA6BD361AE4E857006C3332 /* FakeLocationManager.m */,
);
name = FakeClass;
sourceTree = "<group>";
};
CABC32771AD7CDFD002A4260 /* TestDependence */ = {
isa = PBXGroup;
children = (
... ... @@ -695,6 +708,7 @@
CA7AC79A1ADE0BD500F30791 /* YHDataFactoryTests.m in Sources */,
CA7AC79C1ADE0C0800F30791 /* YHErrorFactoryTests.m in Sources */,
CA7AC7A01ADE0C4F00F30791 /* YHEventFactoryTests.m in Sources */,
CAA6BD371AE4E857006C3332 /* FakeLocationManager.m in Sources */,
CA7AC7911ADE08DC00F30791 /* YHErrorTests.m in Sources */,
CA7AC7971ADE092300F30791 /* YHAnalyItemDataTest.m in Sources */,
);
... ...
... ... @@ -7,6 +7,7 @@
//
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
#import "YHNetworkAssistant.h"
#import "YHDevice.h"
#import "YHStatus.h"
... ... @@ -27,8 +28,8 @@ extern NSString * const JsonKeyDataTypeErrors;
@interface YHAssemblyAssistant : NSObject
@property (strong, nonatomic) YHDevice *device;
@property (strong, nonatomic) YHStatus *currentStatus;
@property (strong, nonatomic, readonly) YHDevice *device;
@property (strong, nonatomic, readonly) YHStatus *currentStatus;
@property (strong, nonatomic) NSMutableDictionary *immediUploadItemDic; // 用于立即发送策略下(device信息是相同的)
+ (instancetype)sharedInstance;
... ... @@ -49,4 +50,6 @@ extern NSString * const JsonKeyDataTypeErrors;
- (void)uploadImmedilyWithEvent:(YHAnalyItemData *)itemData;
- (BOOL)updateLocation:(CLLocation *)location;
@end
... ...
... ... @@ -27,6 +27,9 @@ NSString * const JsonKeyDataTypeErrors = @"errors";
@interface YHAssemblyAssistant ()
@property (strong, nonatomic) YHDevice *device;
@property (strong, nonatomic) YHStatus *currentStatus;
@property (assign, nonatomic) NSUInteger allEventsCount; // 本地持久化event的条数
@property (strong, nonatomic) NSString *eventFilePath;
@property (strong, nonatomic) NSString *eventFileName;
... ... @@ -321,5 +324,22 @@ static dispatch_queue_t persisitingQueue;
self.allEventsCount = 0;
}
- (BOOL)updateLocation:(CLLocation *)location
{
NSNumber *loNumber = [NSNumber numberWithDouble:location.coordinate.longitude];
NSNumber *laNumber = [NSNumber numberWithDouble:location.coordinate.latitude];
NSString *lo = [loNumber stringValue];
NSString *la = [laNumber stringValue];
NSLog(@"newLocation: {longitude:%@, latitude:%@}", lo, la);
if ([lo isEqualToString:self.currentStatus.lo] && [la isEqualToString:self.currentStatus.la]) {
return NO;
}
// 更新经纬度
self.currentStatus.lo = lo;
self.currentStatus.la = la;
return YES;
}
@end
... ...
... ... @@ -7,7 +7,9 @@
//
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
#import "YHError.h"
#import "YHEvent.h"
#define kKeyUserDefaultsLastUploadTimestamp @"lastSendTimestampKey"
#define kKeyUserDefaultsCustomInterval @"customInterval"
... ... @@ -18,7 +20,7 @@ typedef enum _YohoMobStatLogStrategy {
LogStrategyImmedi // 立即发送
} YHLogStrategy;
@interface YH_Analytics : NSObject
@interface YH_Analytics : NSObject <CLLocationManagerDelegate>
/**
* 获取统计对象的实例
*/
... ... @@ -74,6 +76,19 @@ typedef enum _YohoMobStatLogStrategy {
*/
@property (strong, nonatomic) NSString *uid;
/**
* 发送的事件
*/
@property (strong, nonatomic, readonly) YHEvent *event;
/**
* 发送的错误
*/
@property (strong, nonatomic, readonly) YHError *error;
/**
* 定位服务
*/
@property (strong, nonatomic) CLLocationManager *locationManager;
@end
... ...
... ... @@ -6,7 +6,6 @@
// Copyright (c) 2015年 YOHO. All rights reserved.
//
#import <CoreLocation/CoreLocation.h>
#import <CoreTelephony/CTCarrier.h>
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
//#import "YHErrorFactory.h"
... ... @@ -19,7 +18,6 @@
#import "YHCrashReporter.h"
#import "YHAssemblyAssistant.h"
#import "OpenUDID.h"
#import "YHEvent.h"
#define kNetWorkStatusUnknow @"0"
... ... @@ -30,8 +28,7 @@
@interface YH_Analytics () <CLLocationManagerDelegate>
@interface YH_Analytics ()
@property (assign, nonatomic) BOOL isLogSystemWorking;
... ... @@ -39,7 +36,10 @@
@property (assign, nonatomic) NSUInteger eventIndex; // 操作序数
@property (strong, nonatomic) NSTimer *timer;
@property (assign, nonatomic) NSTimeInterval currentInterval;
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) YHEvent *event;
@property (strong, nonatomic) YHError *error;
- (NSString *)timestamp;
... ... @@ -240,22 +240,24 @@ static dispatch_queue_t persisitingQueue;
// 记录event
- (void)logEvent:(NSString *)eventId parameters:(NSDictionary *)param
{
NSLog(@"logEvent %@, %@", eventId, param);
[self startLocationService];
YHEvent *event = [[YHEvent alloc] init];
event.op = eventId;
event.uid = self.uid ? self.uid : @"";
event.ts = [self timestamp];
event.sid = self.session;
self.event = [[YHEvent alloc] init];
self.event.op = eventId;
self.event.uid = self.uid ? self.uid : @"";
self.event.ts = [self timestamp];
self.event.sid = self.session;
self.eventIndex++;
event.index = [NSString stringWithFormat:@"%lu", (unsigned long)self.eventIndex];
event.param = param;
self.event.index = [NSString stringWithFormat:@"%lu", (unsigned long)self.eventIndex];
self.event.param = param;
// 立即发送策略
if (self.logStrategy == LogStrategyImmedi) {
[[YHAssemblyAssistant sharedInstance] uploadImmedilyWithEvent:event];
[[YHAssemblyAssistant sharedInstance] uploadImmedilyWithEvent:self.event];
} else {
[[YHAssemblyAssistant sharedInstance] saveItemData:event];
[[YHAssemblyAssistant sharedInstance] saveItemData:self.event];
}
}
... ... @@ -263,17 +265,19 @@ static dispatch_queue_t persisitingQueue;
// 记录错误数据
- (void)logError:(NSString *)errorType parameters:(NSDictionary *)param
{
YHError *error = [[YHError alloc]init];
error.et = errorType;
error.uid = self.uid ? self.uid : @"";
error.ts = [self timestamp];
error.sid = self.session;
error.param = param;
NSLog(@"logError %@, %@", errorType, param);
self.error = [[YHError alloc]init];
self.error.et = errorType;
self.error.uid = self.uid ? self.uid : @"";
self.error.ts = [self timestamp];
self.error.sid = self.session;
self.error.param = param;
if (self.logStrategy == LogStrategyImmedi) {
[[YHAssemblyAssistant sharedInstance] uploadImmedilyWithEvent:error];
[[YHAssemblyAssistant sharedInstance] uploadImmedilyWithEvent:self.error];
} else {
[[YHAssemblyAssistant sharedInstance] saveItemData:error];
[[YHAssemblyAssistant sharedInstance] saveItemData:self.error];
}
}
... ... @@ -296,10 +300,12 @@ static dispatch_queue_t persisitingQueue;
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *lastUploadTime = [defaults objectForKey:kKeyUserDefaultsLastUploadTimestamp];
NSInteger uploadTimeInterval = [[self timestamp] integerValue] - [lastUploadTime integerValue];
NSString *timeStamp = [self timestamp];
NSInteger uploadTimeInterval = [timeStamp integerValue] - [lastUploadTime integerValue];
if (uploadTimeInterval > self.currentInterval) {
[self uploadDiskData];
[defaults setObject:[self timestamp] forKey:kKeyUserDefaultsLastUploadTimestamp];
[defaults setObject:timeStamp forKey:kKeyUserDefaultsLastUploadTimestamp];
[defaults synchronize];
}
}
... ... @@ -320,27 +326,15 @@ static dispatch_queue_t persisitingQueue;
}
//协议中的方法,作用是每当位置发生更新时会调用的委托方法
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
CLLocationCoordinate2D loc = [newLocation coordinate];
NSNumber *loNumber = [NSNumber numberWithDouble:loc.longitude];
NSNumber *laNumber = [NSNumber numberWithDouble:loc.latitude];
NSString *lo = [loNumber stringValue];
NSString *la = [laNumber stringValue];
NSLog(@"newLocation: {longitude:%@, latitude:%@}", lo, la);
if (![lo isEqualToString:[YHAssemblyAssistant sharedInstance].currentStatus.lo] || ![la isEqualToString:[YHAssemblyAssistant sharedInstance].currentStatus.la]) {
// 更新经纬度
[YHAssemblyAssistant sharedInstance].currentStatus.lo = lo;
[YHAssemblyAssistant sharedInstance].currentStatus.la = la;
if ([[YHAssemblyAssistant sharedInstance] updateLocation:newLocation]) {
[[YHAssemblyAssistant sharedInstance] updateImmediUploadDic];
}
}
//当位置获取或更新失败会调用的方法
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSString *errorMsg = nil;
if ([error code] == kCLErrorDenied) {
... ... @@ -353,14 +347,14 @@ static dispatch_queue_t persisitingQueue;
}
-(void)setLogStrategy:(YHLogStrategy)strategyNumber
- (void)setLogStrategy:(YHLogStrategy)strategyNumber
{
NSUserDefaults *strategy = [NSUserDefaults standardUserDefaults];
[strategy setObject: [NSNumber numberWithInteger:strategyNumber] forKey:@"LOGSTRATEGY"];
[strategy synchronize];
}
-(YHLogStrategy)logStrategy
- (YHLogStrategy)logStrategy
{
NSUserDefaults *strategy = [NSUserDefaults standardUserDefaults];
NSNumber * strategyObj = [strategy objectForKey:@"LOGSTRATEGY"];
... ...
//
// FakeLocationManager.h
// YH_Analytics
//
// Created by Zhou Rongjun on 15/4/20.
// Copyright (c) 2015年 YOHO. All rights reserved.
//
#import <CoreLocation/CoreLocation.h>
@interface FakeLocationManager : NSObject
@property(assign, nonatomic) id<CLLocationManagerDelegate> delegate;
- (void)startUpdatingLocation;
- (void)changeAuthorizationStatus:(CLAuthorizationStatus)status;
- (void)updateLocation:(CLLocation *)newLocation oldLocation:(CLLocation *)oldLocation;
- (void)failedLocation:(NSError *)error;
@end
... ...
//
// FakeLocationManager.m
// YH_Analytics
//
// Created by Zhou Rongjun on 15/4/20.
// Copyright (c) 2015年 YOHO. All rights reserved.
//
#import "FakeLocationManager.h"
@implementation FakeLocationManager
- (void)startUpdatingLocation
{
}
- (void)changeAuthorizationStatus:(CLAuthorizationStatus)status
{
if (self.delegate && [self.delegate respondsToSelector:@selector(locationManager:didChangeAuthorizationStatus:)]) {
[self.delegate locationManager:self didChangeAuthorizationStatus:status];
}
}
- (void)updateLocation:(CLLocation *)newLocation oldLocation:(CLLocation *)oldLocation
{
if (self.delegate && [self.delegate respondsToSelector:@selector(locationManager:didUpdateToLocation:fromLocation:)]) {
[self.delegate locationManager:self didUpdateToLocation:newLocation fromLocation:oldLocation];
}
}
- (void)failedLocation:(NSError *)error
{
if (self.delegate && [self.delegate respondsToSelector:@selector(locationManager:didFailWithError:)]) {
[self.delegate locationManager:self didFailWithError:error];
}
}
@end
... ...
... ... @@ -13,6 +13,9 @@
#import "YHCrashReporter.h"
#import "YHAssemblyAssistant.h"
#import "YH_Analytics.h"
#import "YHEvent.h"
#import "FakeLocationManager.h"
@interface YH_AnalyticsLogicTests : XCTestCase {
@private
... ... @@ -38,6 +41,8 @@
networkAssistantMock = OCMClassMock([YHNetworkAssistant class]);
OCMStub([networkAssistantMock sharedInstance]).andReturn(networkAssistantMock);
analytics = [[YH_Analytics alloc] init];
}
- (void)tearDown {
... ... @@ -45,26 +50,41 @@
[super tearDown];
}
#pragma mark - 逻辑分支测试
#pragma mark - 行为测试
- (void)testStartWithAppIdMethodPrepareImmediUploadDic {
- (void)testStartWithAppIdMethod {
NSLog(@"%@ start", self.name);
analytics = [[YH_Analytics alloc] init];
OCMExpect([networkAssistantMock addReachabilityChangedHandler:[OCMArg any]]);
OCMExpect(ClassMethod([crashReporterMock sharedInstance]));
OCMExpect([assemblyAssistantMock prepareImmediUploadDic]);
[analytics startWithAppId:@"appId"];
OCMVerifyAll(networkAssistantMock);
OCMVerify(ClassMethod([crashReporterMock sharedInstance]));
OCMVerifyAll(assemblyAssistantMock);
NSLog(@"%@ end", self.name);
}
- (void)testStartWithAppIdMethodWithLogStrategyAppLaunch {
- (void)testStartWithAppIdMethodReceiveNotification {
NSLog(@"%@ start", self.name);
analytics = [[YH_Analytics alloc] init];
// NSNotificationCenter *center = [[NSNotificationCenter alloc] init];
// id observerMock = [OCMockObject observerMock];
//
// [center addMockObserver:observerMock name:UIApplicationWillEnterForegroundNotification object:nil];
// [[observerMock expect] notificationWithName:UIApplicationWillEnterForegroundNotification object:[OCMArg any]];
NSLog(@"%@ end", self.name);
}
- (void)testStartWithAppIdMethodWithLogStrategyAppLaunch {
NSLog(@"%@ start", self.name);
analytics.logStrategy = LogStrategyAppLaunch;
OCMExpect([assemblyAssistantMock uploadDiskData]);
... ... @@ -78,8 +98,7 @@
- (void)testStartWithAppIdMethodWithLogStrategyCustom {
NSLog(@"%@ start", self.name);
analytics = [[YH_Analytics alloc] init];
analytics.logStrategy = LogStrategyCustom;
OCMExpect([assemblyAssistantMock uploadDiskData]);
... ... @@ -94,25 +113,37 @@
- (void)testStartWithAppIdMethodWithLogStrategyImmedi {
NSLog(@"%@ start", self.name);
analytics = [[YH_Analytics alloc] init];
analytics.logStrategy = LogStrategyImmedi;
OCMExpect([assemblyAssistantMock uploadDiskData]);
[[assemblyAssistantMock reject] uploadDiskData];
[analytics startWithAppId:@"appId"];
XCTAssertThrows([assemblyAssistantMock verify], @"StartWithAppId should not uploadDiskData when strategy is immediately.") ;
OCMVerifyAll(assemblyAssistantMock);
NSLog(@"%@ end", self.name);
}
- (void)testLogEventMethodWithLogStrategyImmedi {
- (void)testLogEventMethodWithSpecailEvent {
NSLog(@"%@ start", self.name);
NSString *eventId = @"eventId";
NSDictionary *param = @{@"key":@"value"};
[analytics logEvent:eventId parameters:param];
XCTAssertEqual(analytics.event.op, eventId);
XCTAssertEqual(analytics.event.param, param);
analytics = [[YH_Analytics alloc] init];
NSLog(@"%@ end", self.name);
}
- (void)testLogEventMethodWithLogStrategyImmedi {
NSLog(@"%@ start", self.name);
analytics.logStrategy = LogStrategyImmedi;
OCMExpect([assemblyAssistantMock uploadImmedilyWithEvent:[OCMArg any]]);
OCMExpect([assemblyAssistantMock uploadImmedilyWithEvent:[OCMArg isKindOfClass:[YHEvent class]]]);
[analytics logEvent:@"eventId" parameters:nil];
... ... @@ -124,10 +155,9 @@
- (void)testLogEventMethodWithLogStrategyAppLaunch {
NSLog(@"%@ start", self.name);
analytics = [[YH_Analytics alloc] init];
analytics.logStrategy = LogStrategyAppLaunch;
OCMExpect([assemblyAssistantMock saveItemData:[OCMArg any]]);
OCMExpect([assemblyAssistantMock saveItemData:[OCMArg isKindOfClass:[YHEvent class]]]);
[analytics logEvent:@"eventId" parameters:nil];
... ... @@ -139,10 +169,9 @@
- (void)testLogEventMethodWithLogStrategyCustom {
NSLog(@"%@ start", self.name);
analytics = [[YH_Analytics alloc] init];
analytics.logStrategy = LogStrategyCustom;
OCMExpect([assemblyAssistantMock saveItemData:[OCMArg any]]);
OCMExpect([assemblyAssistantMock saveItemData:[OCMArg isKindOfClass:[YHEvent class]]]);
[analytics logEvent:@"eventId" parameters:nil];
... ... @@ -151,13 +180,26 @@
NSLog(@"%@ end", self.name);
}
- (void)testLogErrorMethodWithSpecailError {
NSLog(@"%@ start", self.name);
NSString *errorId = @"errorId";
NSDictionary *param = @{@"key":@"value"};
[analytics logError:errorId parameters:param];
XCTAssertEqual(analytics.error.et, errorId);
XCTAssertEqual(analytics.error.param, param);
NSLog(@"%@ end", self.name);
}
- (void)testLogErrorMethodWithLogStrategyImmedi {
NSLog(@"%@ start", self.name);
analytics = [[YH_Analytics alloc] init];
analytics.logStrategy = LogStrategyImmedi;
OCMExpect([assemblyAssistantMock uploadImmedilyWithEvent:[OCMArg any]]);
OCMExpect([assemblyAssistantMock uploadImmedilyWithEvent:[OCMArg isKindOfClass:[YHError class]]]);
[analytics logError:@"errorId" parameters:nil];
... ... @@ -169,10 +211,9 @@
- (void)testLogErrorMethodWithLogStrategyAppLaunch {
NSLog(@"%@ start", self.name);
analytics = [[YH_Analytics alloc] init];
analytics.logStrategy = LogStrategyAppLaunch;
OCMExpect([assemblyAssistantMock saveItemData:[OCMArg any]]);
OCMExpect([assemblyAssistantMock saveItemData:[OCMArg isKindOfClass:[YHError class]]]);
[analytics logError:@"errorId" parameters:nil];
... ... @@ -184,10 +225,9 @@
- (void)testLogErrorMethodWithLogStrategyCustom {
NSLog(@"%@ start", self.name);
analytics = [[YH_Analytics alloc] init];
analytics.logStrategy = LogStrategyCustom;
OCMExpect([assemblyAssistantMock saveItemData:[OCMArg any]]);
OCMExpect([assemblyAssistantMock saveItemData:[OCMArg isKindOfClass:[YHError class]]]);
[analytics logError:@"errorId" parameters:nil];
... ... @@ -196,4 +236,41 @@
NSLog(@"%@ end", self.name);
}
#pragma mark - Test Location Sevice
- (void)testLocationUpdateSuccess {
NSLog(@"%@ start", self.name);
analytics.locationManager = [[FakeLocationManager alloc] init];
analytics.locationManager.delegate = analytics;
CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:20.0f longitude:120.0f];
[[[assemblyAssistantMock expect] andReturnValue:@YES] updateLocation:newLocation];
OCMExpect([assemblyAssistantMock updateImmediUploadDic]);
[analytics startWithAppId:@"appId"];
[(FakeLocationManager *)analytics.locationManager updateLocation:newLocation oldLocation:nil];
OCMVerifyAll(assemblyAssistantMock);
NSLog(@"%@ end", self.name);
}
- (void)testLocationUpdateFailed {
NSLog(@"%@ start", self.name);
analytics.locationManager = [[FakeLocationManager alloc] init];
analytics.locationManager.delegate = analytics;
CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:20.0f longitude:120.0f];
[[[assemblyAssistantMock expect] andReturnValue:@NO] updateLocation:newLocation];
[[assemblyAssistantMock reject] updateImmediUploadDic];
[analytics startWithAppId:@"appId"];
[(FakeLocationManager *)analytics.locationManager updateLocation:newLocation oldLocation:nil];
OCMVerifyAll(assemblyAssistantMock);
NSLog(@"%@ end", self.name);
}
@end
... ...
... ... @@ -24,7 +24,7 @@
[super setUp];
// Put setup code here. This method is called before the invocation of each test method in the class.
NSLog(@"%@ setUp", self.name);
mock = [OCMockObject mockForClass:[YH_Analytics class]];
mock = OCMClassMock([YH_Analytics class]);
XCTAssertNotNil(mock, @"Cannot create YH_Analytics mock");
}
... ...