【问题标题】:Unrecognized Selector SenTestCase for Category类别无法识别的选择器 SenTestCase
【发布时间】:2011-03-28 21:05:11
【问题描述】:

我在 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"); 
}

但是,这会导致我的测试因“无法识别的选择器发送到实例”而崩溃(未失败)。

如何测试库中的类别?

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

【问题讨论】:

    标签: iphone objective-c cocoa-touch xcode testing


    【解决方案1】:

    我自己在寻找这个问题的答案,发现(我相信)一个更简单的解决方案,它不需要记住在向项目中添加新类别类时在 Compile Sources 列表中添加引用。

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

    可以在Apple Reference 找到有关此错误实际发生原因的进一步说明。

    【讨论】:

    • 这应该是公认的答案。有时我希望我能多次投票。
    • @Shaggy 对不起,我没有改变答案。我刚刚又遇到了这个问题,这是一个更好的解决方法。
    • 不适合我 :( 我有静态库需要编写单元测试。代码编译和构建成功但测试用例失败无法识别的选择器。当我在测试目标中添加 .m 文件时它工作正常跨度>
    • 当我添加 -ObjC 很多 Apple Mach -O 错误来
    【解决方案2】:

    编辑:请务必查看 this answer 关于单元测试未找到文件的信息

    +1 用于上传项目。问题是您的测试目标在构建阶段中不包含 NSString+Inflections.m。

    在 XCode 4 中

    1. 点击导航器顶部的“Poppy”
    2. 在目标下选择“PoppyTests”
    3. 转到构建阶段
    4. 扩展编译源
    5. 点击+号,然后添加NSString+Inflections.m

    然后你应该得到类似于以下输出的东西

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

    【讨论】:

    • 谢谢。这解决了问题,但 PoppyTest 目标确实将 Poppy 作为依赖项。我做了更多查看,发现它也可以通过添加-all_load 作为 PoppyTest 目标的其他链接器标志来修复(在构建设置下)。这样就不需要将所有源文件都添加到两个目标中。
    • 是的,我没有看到,起初我以为这是-all_load 之类的问题,因为您正在处理一个类别。如果不是单元测试,我会推荐-force_load [dependency name],因为该选项只会加载指定依赖项中的所有符号。
    • 这为我解决了问题。奇怪的是它工作正常,当它停止为我工作时,它正在使用旧的源文件。
    • @KevinSylvestre 你如何设置 -all_load 标志?它在构建设置中的某个地方吗?
    • 下面比尔的回答比这个要好得多。您不应手动将库的源文件添加到单元测试目标。每次你这样做,一只小猫都会哭。您应该将您的单元测试与您的库链接起来。每次你这样做,小猫都会微笑。
    【解决方案3】:

    我还可以确认,将所需文件添加到测试项目的 Build Phases > Compile Sources 集合可以解决此问题。非常感谢!

    但是,当我尝试使用 -all_load 方法时,我开始收到一堆错误,例如 _CGSizeZero 对于架构 i386 未定义。事实证明,某些代码(例如,我在其中一个类中使用 CGSizeZero 的代码)会使第二种方法中断。

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

    【讨论】:

      【解决方案4】:

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

      1) 选择项目并转到目标。

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

      3) 现在尝试运行 XCTest 单元。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-29
        • 1970-01-01
        • 2018-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多