1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
//
// GMPhotoTest.m
// GMPhobos
//
// Created by Thierry on 16/1/28.
// Copyright © 2016年 licong. All rights reserved.
//
#import <XCTest/XCTest.h>
#import <GMPhobos/Phobos.h>
#import "GMPhobosController.h"
#define PhobosCacheKey @"PhobosCacheKey"
@import GMCache;
NSString *const MockAppName = @"gengmei_test";
NSString *const MockChannelId = @"AppStore";
NSString *const MockEventId = @"eventId";
NSString *const MockUserId = @"1";
NSString *const MockCityId = @"beijing";
@interface GMPhotoTest : XCTestCase
@property Phobos *client;
@end
@implementation GMPhotoTest
- (void)setUp {
[super setUp];
_client = [Phobos clientWithAppName:MockAppName channelId:MockChannelId];
[Phobos setSharedClient:_client];
}
- (void)tearDown {
// Put teardown code here. This method is called after the invocation of each test method in the class.
[super tearDown];
[GMCache removeObjectAtDucmentPathWithkey:PhobosCacheKey];
}
/**
* @brief 测试有用户ID的时候,埋点事件是否正确
*
* @since <#version number#>
*/
- (void)testClientWithUserId{
[_client setUserId:MockUserId];
[_client setCurrentCityId:MockCityId];
[Phobos track:MockEventId];
NSArray *array = [GMCache fetchObjectAtDucmentPathWithkey:PhobosCacheKey];
XCTAssertTrue(array.count == 1, @"array is empty");
NSDictionary *dict = [array objectAtIndex:0];
[self verfiyDict:dict];
XCTAssertTrue([[dict objectForKey:@"user_id"] isEqualToString:MockUserId] , @"Invalid user_id value");
}
/**
* @brief 测试发送不带参数事件成功 (由之前的实例方法变成类方法)
*
* @since <#version number#>
*/
- (void)testTrackEventWithoutAttr{
[Phobos track:MockEventId];
NSArray *array = [GMCache fetchObjectAtDucmentPathWithkey:PhobosCacheKey];
XCTAssertTrue(array.count == 1, @"array is empty");
NSDictionary *dict = [array objectAtIndex:0];
[self verfiyDict:dict];
}
/**
* @brief 测试发送带参数事件成功
*
* @since <#version number#>
*/
- (void)testTrackEventWithAttr{
NSDictionary *attr = @{@"attr":@"track_attr"};
[Phobos track:MockEventId attributes:attr];
NSArray *array = [GMCache fetchObjectAtDucmentPathWithkey:PhobosCacheKey];
XCTAssertTrue(array.count == 1, @"array is empty");
NSDictionary *dict = [array objectAtIndex:0];
[self verfiyDict:dict];
//验证Param的值是否正确
NSString *value = [[dict valueForKey:@"params"] valueForKey:@"attr"];
XCTAssertTrue([value isEqualToString:@"track_attr"], @"Invalid event attributes");
}
/**
* @brief 测试立即发送带参数事件成功
*
* @since <#version number#>
*/
- (void)testTrackEventWithAttrAndSendNow{
// Given
NSDictionary *attr = @{@"attr":@"track_attr"};
// When
[Phobos track:MockEventId attributes:attr sendNow:YES];
// Then
NSArray *array = [GMCache fetchObjectAtDucmentPathWithkey:PhobosCacheKey];
XCTAssertTrue(array.count == 0, @"array should be empty");
}
- (void)verfiyDict:(NSDictionary *)dict{
NSArray *keys = [dict allKeys];
XCTAssertTrue([keys containsObject:@"type"], @"Missing type");
XCTAssertTrue([keys containsObject:@"app"], @"Missing app");
XCTAssertTrue([keys containsObject:@"version"], @"Missing version");
XCTAssertTrue([keys containsObject:@"device"], @"Missing device");
XCTAssertTrue([keys containsObject:@"user_id"], @"Missing user_id");
XCTAssertTrue([keys containsObject:@"create_at"], @"Missing create_at");
XCTAssertTrue([keys containsObject:@"params"], @"Missing params");
}
- (void)testCatchNullInAttributes {
_client.captureNullExpection = ^(NSString *eventId, NSDictionary *att) {
NSCAssert([att[@"bussness_id"] integerValue] == 1244, @"testCatchNullInAttributes 没有捕获到有用信息");
};
NSDictionary *attributes = @{@"key": [NSNull null],
@"bussness_id": @1244};
[Phobos track:@"testCatchNullInAttributes" attributes:attributes];
}
// 某种情况下没有先走 onPageStart,只走了OnPageEnd,此时数据应该完整,某个key对应的value可以是空
- (void)testOnPageStart {
GMPhobosController *controller = [GMPhobosController new];
controller.pageName = @"pageNameTest";
controller.businessId = @"businessIdTest";
controller.referrerId = @"rreferrerIdTest";
[controller viewWillAppear:true];
XCTAssertTrue(controller.inTime.integerValue > 0, "inTime 应该有值");
}
// 某种情况下没有先走 onPageStart,只走了OnPageEnd,此时数据应该完整,某个key对应的value可以是空
- (void)testOnPageEnd {
GMPhobosController *controller = [GMPhobosController new];
controller.pageName = @"pageNameTest";
controller.businessId = @"businessIdTest";
controller.referrerId = @"rreferrerIdTest";
[controller viewWillAppear:true];
[controller viewWillDisappear:true];
[self paramUnNilCheck];
NSArray *array = [GMCache fetchObjectAtDucmentPathWithkey:PhobosCacheKey];
XCTAssertTrue(array.count != 0, @"PhobosCacheKey 下面应该有数据");
NSDictionary *dic = array[0][@"params"];
XCTAssertTrue([dic[@"referrer_id"] isEqualToString:@"rreferrerIdTest"], @"referrerId至少使用默认的空字符串");
}
- (void)testSimulativePageViewEvent {
[_client simulativePV:nil businessId:nil referer:nil];
[self paramUnNilCheck];
}
- (void)paramUnNilCheck {
NSArray *array = [GMCache fetchObjectAtDucmentPathWithkey:PhobosCacheKey];
XCTAssertTrue(array.count != 0, @"PhobosCacheKey 下面应该有数据");
NSDictionary *dic = array[0][@"params"];
XCTAssertTrue(dic[@"page_name"] != nil, @"page_name至少使用默认的空字符串");
XCTAssertTrue([dic[@"referer"] integerValue] >= 0, @"referer至少使用默认的空字符串");
XCTAssertTrue(dic[@"business_id"] != nil, @"business_id至少使用默认的空字符串");
}
#pragma mark - 属性test
- (void)testNeedLogPV {
UIViewController *controller = [UIViewController new];
XCTAssertTrue(controller.needLogPV, @"needLogPV应该默认为YES");
controller.needLogPV = NO;
XCTAssertFalse(controller.needLogPV, @"needLogPV赋值为NO时应该NO");
}
#pragma mark - 其它方法test
- (void)testVisibleController {
}
@end