Iphone 无法识别类别的选择器SentTestCase

Iphone 无法识别类别的选择器SentTestCase,iphone,objective-c,cocoa-touch,xcode,testing,Iphone,Objective C,Cocoa Touch,Xcode,Testing,我在XCode 4中使用单元测试创建了一个新的Cocoa Touch静态库项目,并添加了一个类别: // NSString+Inflections.h @interface NSString (Inflections) - (NSString *)pluralize; @end // NSString+Inflections.m @implementation NSString (Inflections) - (NSString *)pluralize { return self; } @en

我在XCode 4中使用单元测试创建了一个新的Cocoa Touch静态库项目,并添加了一个类别:

// NSString+Inflections.h
@interface NSString (Inflections)
- (NSString *)pluralize;
@end

// NSString+Inflections.m
@implementation NSString (Inflections)
- (NSString *)pluralize { return self; }
@end
然后将适当的导入语句添加到我的测试用例中,并编写以下测试:

- (void)testPluralize
{
  NSString *test = @"person";
  NSString *expected = @"people";

  NSString *actual = [test pluralize];

  STAssertEqualObjects(actual, expected, @"Whoops"); 
}
但是,这会导致我的测试崩溃(而不是失败),并出现“无法识别的选择器发送到实例”

如何在库中测试类别


如果我的描述不充分,我已经压缩并上传了整个项目。

编辑:确保查看关于单元测试未找到文件的信息

+1用于上载项目。问题是,您的测试目标在构建阶段不包括NSString+defluctions.m

在XCode 4中

  • 单击导航器顶部的“罂粟”
  • 在目标下选择“PoppyTests”
  • 进入构建阶段
  • 展开编译源代码
  • 单击+号,然后添加NSString+屈折变化。m
  • 然后,您将获得类似于以下输出的结果

    TestSuite'/blahblah/PoppyTests.octest(Tests)”于2011-03-28 21:31:34+0000完成。 执行了1次测试,有1次失败(0 意外)在0.000(0.002)秒内


    我还可以确认,将所需的文件添加到测试项目的buildphases>compilesources集合可以解决这个问题。非常感谢

    然而,当我尝试使用-all_load方法时,我开始收到一系列错误,比如_CGSizeZero对于架构i386是未定义的。事实证明,一些代码——比如我在我的一个类中使用CGSizeZero的代码——可以使第二种方法中断


    然而,一旦我用CGSizeMake(0,0)替换了CGSizeZero,第二种方法也很有效。

    我自己也在寻找这个问题的答案,并找到了(我相信)一个更简单的解决方案,它不需要在项目中添加新类别时记住在编译源代码列表中添加引用

    在测试目标的构建设置中,将
    -ObjC
    添加到Linking/Other Linker Flags值


    有关此错误实际发生原因的进一步解释,请参见。

    我在Objective-c项目中工作时也遇到过同样的情况。我做了以下步骤,一切顺利

    1) 选择项目并转到目标

    2) 选择测试目标并添加
    -ObjC
    ,如图所示


    3) 现在尝试运行单元测试

    谢谢。这解决了问题,但PoppyTest目标确实将Poppy作为依赖项。我做了更多的研究,发现它也可以通过添加
    -all\u load
    作为PoppyTest目标的另一个链接器标志来修复(在构建设置下)。这样就不需要将所有源文件都添加到两个目标中。这是正确的,我没有看到这一点,起初我认为这是一个
    -all\u load
    类问题,因为您使用的是一个类别。如果不是单元测试,我建议使用
    -force_load[dependency name]
    ,因为该选项只加载指定依赖项中的所有符号。这为我解决了这个问题。奇怪的是它工作得很好,当它停止为我工作时,它使用的是旧的源文件。@KevinSylvestre如何设置-all_load标志?它在构建设置中的某个地方吗?比尔下面的答案比这个好得多。您不应该手动将库的源文件添加到单元测试目标。每次你这么做,小猫都会哭。您应该将单元测试与库链接起来。每次你这么做,小猫都会微笑。这应该是公认的答案。有时候我希望我能多次投票。@Shaggy抱歉我没有改变答案。我又遇到了这个问题,这是一个更好的解决方案。对我来说不起作用:(我有静态库需要编写单元测试。代码编译和构建成功,但测试用例失败,无法识别选择器。当我在测试目标中添加.m文件时,它可以正常工作。当我添加-ObjC时,会出现很多Apple Mach-O错误