Objective c 如何使用TDD测试类的属性?
为什么在第43行使用方法Objective c 如何使用TDD测试类的属性?,objective-c,tdd,respondstoselector,Objective C,Tdd,Respondstoselector,为什么在第43行使用方法respondsToSelector:或instancerespondstoselector:时无法绕过statsertTrue //我的测试用例代码 - (void)testApiClass { //Check object NSString* classKey = @"Api"; id obj = NSClassFromString(classKey); STAssertNotNil(obj, [NSString stringWithF
respondsToSelector:
或instancerespondstoselector:
时无法绕过statsertTrue
//我的测试用例代码
- (void)testApiClass {
//Check object
NSString* classKey = @"Api";
id obj = NSClassFromString(classKey);
STAssertNotNil(obj, [NSString stringWithFormat:@"Model '%@' not found.", classKey]);
//Check properties
NSArray* properties =
@[
@"performSyncRequestWithUri::",
@"performAsyncRequestWithUri:::",
];
for (NSString* property in properties) {
SEL propertySel = NSSelectorFromString(property);
BOOL isRespondsToSel = [obj respondsToSelector:propertySel];
STAssertTrue(isRespondsToSel, [NSString stringWithFormat:@"Property '%@' not found on object of class name '%@'", property, [obj class]]);
}
}
@interface Api : NSObject
- (NSDictionary*)performSyncRequestWithUri:(NSString *)requestUri params:(NSDictionary *)params;
- (void)performAsyncRequestWithUri:(NSString *)requestUri params:(NSDictionary *)params completionHandler:(void (^)(NSDictionary *, NSError *))completionBlock;
@end
这些方法被称为
performAsyncRequestWithUri:params:completionHandler:
和performsynccrequestwithuri:params:
这些方法被称为performAsyncRequestWithUri:params:completionHandler:
和performsynccrequestwithuri:params:
属性中的字符串常量数组与Api
界面中的选择器不匹配
而且,这两个选择器都不引用属性。属性有两个选择器:一个是没有冒号的getter,如stringValue
;另一个是setter,如setStringValue:
,有一个冒号,通常以set
开头
创建选择器数组,而不是将选择器嵌入字符串中:
SEL selectors[] = {
@selector(performSyncRequestWithUri:params:),
@selector(performAsyncRequestWithUri:params:completionHandler:),
NULL
};
for (size_t i = 0; selectors[i]; ++i) {
SEL selector = selectors[i];
BOOL respondsToSelector = [obj respondsToSelector:selector];
STAssertTrue(respondsToSelector, [NSString stringWithFormat:
@"Object %@ doesn't respond to selector %s",
obj, sel_getName(selector)]);
}
这里的优点是,Xcode将为您自动完成选择器,您可以命令单击选择器跳转到它们的定义。属性数组中的字符串常量与
Api
界面中的选择器不匹配
而且,这两个选择器都不引用属性。属性有两个选择器:一个是没有冒号的getter,如stringValue
;另一个是setter,如setStringValue:
,有一个冒号,通常以set
开头
创建选择器数组,而不是将选择器嵌入字符串中:
SEL selectors[] = {
@selector(performSyncRequestWithUri:params:),
@selector(performAsyncRequestWithUri:params:completionHandler:),
NULL
};
for (size_t i = 0; selectors[i]; ++i) {
SEL selector = selectors[i];
BOOL respondsToSelector = [obj respondsToSelector:selector];
STAssertTrue(respondsToSelector, [NSString stringWithFormat:
@"Object %@ doesn't respond to selector %s",
obj, sel_getName(selector)]);
}
这里的优点是Xcode将为您自动完成选择器,您可以命令单击选择器跳转到它们的定义。“在第43行”没有行号“performSyncRequestWithUri::”“performSyncRequestWithUri:::”您真的有这样命名的方法吗?我对此深表怀疑。按照惯例,我们通常不使用空关键字创建方法。在本例中,第43行表示下一行:
BOOL isRespondsToSel=[obj respondsToSelector:propertySel]代码>我真的有这个方法。你们可以在我的帖子下面找到接口(我有实现),这不是TDD。编写一个复杂的测试(使用for循环!)来证明一个对象符合它的接口有什么意义?Xcode将告诉您,无需测试。相反,为一项功能编写一个简单的小测试。“在第43行“没有行号”performSyncRequestWithUri::“performSyncRequestWithUri:::”您真的有这样命名的方法吗?我对此深表怀疑。按照惯例,我们通常不使用空关键字创建方法。在本例中,第43行表示下一行:BOOL isRespondsToSel=[obj respondsToSelector:propertySel]代码>我真的有这个方法。你们可以在我的帖子下面找到接口(我有实现),这不是TDD。编写一个复杂的测试(使用for循环!)来证明一个对象符合它的接口有什么意义?Xcode将告诉您,无需测试。相反,为一项功能编写一个简单的小测试。