Skip to content

Commit fbe029f

Browse files
authored
Merge pull request #673 from harryphone/master
add object test case
2 parents dc14fce + 0f6228c commit fbe029f

File tree

8 files changed

+953
-87
lines changed

8 files changed

+953
-87
lines changed

AVOS/AVOS.xcodeproj/project.pbxproj

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
objects = {
88

99
/* Begin PBXBuildFile section */
10+
C43D444627281D39006A31FD /* LCTestObject.m in Sources */ = {isa = PBXBuildFile; fileRef = C43D444527281D39006A31FD /* LCTestObject.m */; };
11+
C4B25E3D27267DE700F9414F /* LCObjectTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4B25E3C27267DE700F9414F /* LCObjectTestCase.swift */; };
1012
D305F7B0235577AD00222EBC /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = D305F7AF235577AD00222EBC /* main.swift */; };
1113
D30B6A1424A09978006ABE09 /* LeanCloudObjc.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D30B6A0B24A09978006ABE09 /* LeanCloudObjc.framework */; };
1214
D30B6A1B24A09978006ABE09 /* LeanCloudObjc.h in Headers */ = {isa = PBXBuildFile; fileRef = D30B6A0D24A09978006ABE09 /* LeanCloudObjc.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -529,6 +531,9 @@
529531
9AD392491BFD7BE600D28074 /* MessagesProtoOrig.pbobjc.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MessagesProtoOrig.pbobjc.m; sourceTree = "<group>"; };
530532
9AD651D31BD9470900C55F85 /* LCIMDynamicObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LCIMDynamicObject.h; sourceTree = "<group>"; };
531533
9AD651D41BD9470900C55F85 /* LCIMDynamicObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LCIMDynamicObject.m; sourceTree = "<group>"; };
534+
C43D444427281D39006A31FD /* LCTestObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LCTestObject.h; sourceTree = "<group>"; };
535+
C43D444527281D39006A31FD /* LCTestObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LCTestObject.m; sourceTree = "<group>"; };
536+
C4B25E3C27267DE700F9414F /* LCObjectTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LCObjectTestCase.swift; sourceTree = "<group>"; };
532537
D305F7A72355760100222EBC /* CLI */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = CLI; sourceTree = BUILT_PRODUCTS_DIR; };
533538
D305F7AF235577AD00222EBC /* main.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = main.swift; path = ../main.swift; sourceTree = "<group>"; };
534539
D30B6A0B24A09978006ABE09 /* LeanCloudObjc.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LeanCloudObjc.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -1232,8 +1237,11 @@
12321237
isa = PBXGroup;
12331238
children = (
12341239
D30B6B6024A0A932006ABE09 /* LeanCloudObjcTests-Bridging-Header.h */,
1240+
C43D444427281D39006A31FD /* LCTestObject.h */,
1241+
C43D444527281D39006A31FD /* LCTestObject.m */,
12351242
D30B6B6124A0A933006ABE09 /* BaseTestCase.swift */,
12361243
D3AD74AA24BC216200D1BBEE /* LCUserTestCase.swift */,
1244+
C4B25E3C27267DE700F9414F /* LCObjectTestCase.swift */,
12371245
D313717F26BBDAC200123756 /* LCQueryTestCase.swift */,
12381246
D33127D226CBAD6D00BBDE09 /* LCFileTestCase.swift */,
12391247
D33127D426CE391500BBDE09 /* LCLeaderboardTestCase.swift */,
@@ -1811,6 +1819,8 @@
18111819
D30B6B6224A0A933006ABE09 /* BaseTestCase.swift in Sources */,
18121820
D313718026BBDAC200123756 /* LCQueryTestCase.swift in Sources */,
18131821
D36A095A25BEA75000A4F312 /* IMMessageTestCase.swift in Sources */,
1822+
C43D444627281D39006A31FD /* LCTestObject.m in Sources */,
1823+
C4B25E3D27267DE700F9414F /* LCObjectTestCase.swift in Sources */,
18141824
D3AD74AB24BC216200D1BBEE /* LCUserTestCase.swift in Sources */,
18151825
D33127D526CE391500BBDE09 /* LCLeaderboardTestCase.swift in Sources */,
18161826
D33127D326CBAD6D00BBDE09 /* LCFileTestCase.swift in Sources */,

AVOS/LeanCloudObjcTests/BaseTestCase.swift

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,20 @@ class BaseTestCase: XCTestCase {
1414
static let timeout: TimeInterval = 60.0
1515
let timeout: TimeInterval = 60.0
1616

17+
static let className = "TestObject"
18+
19+
enum TestField: String {
20+
case integer = "testInteger"
21+
case double = "testDouble"
22+
case boolean = "testBoolean"
23+
case string = "testString"
24+
case array = "testArray"
25+
case dict = "testDictionary"
26+
case date = "testDate"
27+
case data = "testData"
28+
case object = "testObject"
29+
}
30+
1731
static var uuid: String {
1832
return UUID().uuidString.replacingOccurrences(of: "-", with: "")
1933
}
@@ -143,3 +157,114 @@ extension BaseTestCase {
143157
application.setWithIdentifier(appInfo.id, key: appInfo.key)
144158
}
145159
}
160+
161+
162+
163+
enum LCTestError: String, Error {
164+
165+
case valueNotExist
166+
case typeNotMatch
167+
}
168+
169+
extension LCTestError: LocalizedError {
170+
var errorDescription: String? {
171+
return self.rawValue
172+
}
173+
}
174+
175+
extension BaseTestCase {
176+
177+
static func valueIsEqual<T: Equatable> (first: T, second: T) -> Bool {
178+
return first == second
179+
}
180+
181+
static func getValue<T>(from object: LCObject, key field: String) throws -> T {
182+
let value = object.object(forKey: field)
183+
guard let value = value else {
184+
throw LCTestError.valueNotExist
185+
}
186+
187+
guard let value = value as? T else {
188+
throw LCTestError.typeNotMatch
189+
}
190+
return value
191+
}
192+
193+
static func verifyLCObjectValues(object: LCObject, needVerifyFields: [TestField: Any]) {
194+
// 这里类型一致需要开发者自己控制,如果不一致不要调用该方法,自己手动校验
195+
for (field, value) in needVerifyFields {
196+
switch field {
197+
case .integer:
198+
verifyLCObjectFieldValue(object: object, fieldName: field.rawValue, value: value as! Int)
199+
case .double:
200+
verifyLCObjectFieldValue(object: object, fieldName: field.rawValue, value: value as! Double)
201+
case .boolean:
202+
verifyLCObjectFieldValue(object: object, fieldName: field.rawValue, value: value as! Bool)
203+
case .string:
204+
verifyLCObjectFieldValue(object: object, fieldName: field.rawValue, value: value as! String)
205+
case .array:
206+
verifyLCObjectFieldValue(object: object, fieldName: field.rawValue, value: value as! NSArray)
207+
case .dict:
208+
verifyLCObjectFieldValue(object: object, fieldName: field.rawValue, value: value as! NSDictionary)
209+
case .date:
210+
if let verifyValue = value as? Date,
211+
let realValue: Date = try? getValue(from: object, key: field.rawValue) {
212+
let interval = verifyValue.timeIntervalSince(realValue)
213+
XCTAssert(fabs(interval) < 0.01, "字段\(field.rawValue)发生错误,需要校验的值为:\(verifyValue),实际值却是:\(realValue)")
214+
} else {
215+
XCTFail("字段\(field.rawValue)类型错误")
216+
}
217+
case .data:
218+
verifyLCObjectFieldValue(object: object, fieldName: field.rawValue, value: value as! Data)
219+
case .object:
220+
verifyLCObjectFieldValue(object: object, fieldName: field.rawValue, value: value as! LCObject)
221+
}
222+
223+
}
224+
}
225+
226+
227+
static func verifyLCObjectValues(objectID: String, needVerifyFields: [TestField: Any], className: String = LCObjectTestCase.className) {
228+
let object = LCObject.init(className: className, objectId: objectID)
229+
XCTAssert(object.fetch())
230+
verifyLCObjectValues(object: object, needVerifyFields: needVerifyFields)
231+
}
232+
233+
static func verifyLCObjectFieldValue<T :Equatable>(object: LCObject, fieldName: String, value: T) {
234+
235+
do {
236+
let realValue: T = try getValue(from: object, key: fieldName)
237+
XCTAssert(value == realValue, "字段\(fieldName)发生错误,需要校验的值为:\(value),实际值却是:\(realValue)")
238+
} catch {
239+
XCTFail("字段\(fieldName)发生错误: " + error.localizedDescription)
240+
}
241+
}
242+
243+
static func createLCObject(fields: [TestField: Any], save: Bool = true, className: String = LCObjectTestCase.className) -> LCObject {
244+
let object = LCObject.init(className: className)
245+
for (field, value) in fields {
246+
object.setObject(value, forKey: field.rawValue)
247+
}
248+
if save {
249+
XCTAssert(object.save())
250+
XCTAssertNotNil(object.objectId)
251+
}
252+
return object
253+
}
254+
255+
// @inline(__always)
256+
// func setLCObjectFieldValues(object: LCObject, fields: [TestField: Any]){
257+
// for (field, value) in fields {
258+
// object.setObject(value, forKey: field.rawValue)
259+
// }
260+
// }
261+
262+
static func updateLCObject(objectID: String, className: String = LCObjectTestCase.className, updateAction: ((LCObject) -> ())) {
263+
let object = LCObject.init(className: className, objectId: objectID)
264+
updateAction(object)
265+
XCTAssert(object.save())
266+
}
267+
268+
269+
}
270+

0 commit comments

Comments
 (0)