我在XCode 4中使用单元测试创建了一个新的Cocoa Touch静态库项目并添加了一个类别:
// NSString+Inflections.h
@interface NSString (Inflections)
- (NSString *)pluralize;
@end
// NSString+Inflections.m
@implementation NSString (Inflections)
- (NSString *)pluralize { return self; }
@end
然后将相应的import语句添加到我的测试用例中并编写了以下测试:
- (void)testPluralize
{
NSString *test = @"person";
NSString *expected = @"people";
NSString *actual = [test pluralize];
STAssertEqualObjects(actual, expected, @"Whoops");
}
但是,这会导致我的测试崩溃(不会失败),并且'无法识别的选择器被发送到实例'。
如何测试库中的类别?
如果我的描述不充分,我已经压缩并上传了整个项目here。
答案 0 :(得分:19)
我自己正在寻找这个问题的答案,并且发现(我相信)一个更简单的解决方案,无论何时在项目中添加新的类别类时都不需要记住在Compile Sources列表中添加引用。
在测试目标的构建设置中,将-ObjC
添加到“链接/其他链接器标志”值。
可以在Apple Reference找到有关此错误实际发生原因的进一步说明。
答案 1 :(得分:13)
修改:请务必查看关于单元测试未找到文件的this answer
+1用于上传项目。问题是您的测试目标在Build Phases中不包含NSString + Inflections.m。
在XCode 4中
然后您应该获得类似以下输出的内容
TestSuite'/blahblah/PoppyTests.octest(Tests)'于2011-03-28 21:31:34 +0000完成。 执行1次测试,1次失败(0 意外)在0.000(0.002)秒
答案 2 :(得分:1)
我还可以确认将所需文件添加到Test项目的Build Phases> Compile Sources集合解决了这个问题。非常感谢!
然而,当我尝试使用-all_load方法时,我开始收到一堆错误,例如_CGSizeZero未定义为架构i386。事实证明,有些代码 - 比如我在其中一个类中使用CGSizeZero的代码 - 可以使第二种方法破解。
然而,一旦我用CGSizeMake(0,0)替换CGSizeZero,第二种方法也很有效。
答案 3 :(得分:0)