RZAssert 1.0.2

RZAssert 1.0.2

测试测试
Lang语言 Obj-CObjective C
许可协议 MIT
Released上次发布2015年3月

Zev EisenbergRZAffirmMichael Gorbach维护。



RZAssert 1.0.2

RZAssert为您的断言添加了易于实现的便捷性和明确性的意图。RZAssert定义了宏,类似于注释,表达意图,但它们永远不会过时,因为它们是由编译器检查的。RZ_ASSERT_TRUERZ_ASSERT_FALSERZASSERT_NOT_NILRZASSERT_NONEMPTY_STRING都精确地执行您认为它们应该执行的操作,并将有用的消息传递到NSAssert

RZAssert还包括更多在多种情境下有用的断言。例如

  1. 您在一个类上定义了一个方法,但您希望此方法只由子类调用。使用RZASSERT_SUBCLASSES_MUST_OVERRIDE,如果方法直接从基类调用,则会抛出异常。

    @implementation RZSuperclass
    
    - (void)aMethodThatShouldBeCalledFromSubclassesOnly
    {
        RZASSERT_SUBCLASSES_MUST_OVERRIDE;
    }
    
    @end
  2. 您定义了一个应该永远不会发生的情况的switch语句。使用RZASSERT_SHOULD_NEVER_GET_HERE,如果程序传递了不期望的情况到switch语句,则会抛出异常。

    typedef NS_ENUM(NSInteger, RZAwesomeMode) {
        INVAwesomeModeNotSet = 0,
        INVAwesomeModeIsAwesome
    };
    
    @implementation RZMyClass
    
    - (void)configureThingsForAwesomeMode:(RZAwesomeMode)awesomeMode
    {
          switch ( awesomeMode ) {
                case INVAwesomeModeNotSet: {
                    RZASSERT_SHOULD_NEVER_GET_HERE;
                    break;
                }
                case INVAwesomeModeIsAwesome: {
                    [self doAwesomeStuff];
                    break;
                }
            }
    }
    
    @end
  3. 您定义了一个方法,该方法以对象作为其参数之一,并且您想确认该对象遵守特定协议。使用RZASSERT_CONFORMS_PROTOCOL,如果程序传递了不遵守协议的实例到方法,则会抛出异常。

    - (void)configureWithDictionary:(RZMyViewController *)myViewController
    {
        RZASSERT_CONFORMS_PROTOCOL(myViewController, @protocol(RZMyDelegate));
    }

自定义日志记录

通常建议您在生产构建中禁用断言。然而,这也意味着在测试中本应抛出有用断言的代码路径将在用户的设备上静默运行,可能导致无法知的崩溃。当收到缺少断言可能提供的重要信息的崩溃日志时,可能会给人带来挫败感。

RZAssert通过提供一个生产环境中运行自定义日志记录代码的设施解决了这一点,在测试中您可能会遇到断言错误。请在-application:didFinishLaunchingWithOptions:等类似位置运行此代码一次。

[RZAssert configureWithLoggingHandler:^(NSString *message) {
   [MyCoolLoggingHandler logMessage:@"Hit assertion: %@", message];
}];

一旦您配置了日志处理程序块,如果在禁用断言的情况下编译代码,您对RZAssert宏的所有调用将自动记录到您的自定义日志处理程序中。这对于与Jerry系统一起使用非常棒,这样您可以获得有关导致后续崩溃可能发生的情况的线索。

关于NS_BLOCK_ASSERTIONS的警告

您可能有一些这样的代码:

#if !defined(NS_BLOCK_ASSERTIONS)
    MyClass *foo = self.bar.baz; // This is unused if the next is gone
    RZASSERT_NOT_NIL(foo); // This line is gone when assertions are disabled
#endif

这样做是为了避免在禁用断言的情况下编译时编译器抱怨foo未使用。但是,如果您希望将RZAssert调用在发布构建中转换为日志,不要在检查NS_BLOCK_ASSERTIONS后将任何断言包装起来,因为您总是希望它们运行。保留对NS_BLOCK_ASSERTIONS的检查,用于昂贵的测试,您真的只想在调试时运行测试。

用法

要运行示例项目,请输入pod try rzassert,然后运行示例项目。断言有两种不同的行为

  1. 在断言上抛出异常(因此崩溃)。
  2. 使用您选择的记录器记录断言,并且不会崩溃。

要查看这两种行为,请进入示例项目的构建设置,并将启用Foundation断言更改为YESNO用于调试构建。然后,运行示例应用程序并单击任一按钮。启用断言后,应用程序将崩溃。禁用断言后,您将在控制台看到一条日志信息。

安装

RZAssert可以通过CocoaPods获取。要安装,只需将以下行添加到您的Podfile中

pod RZAssert

作者

Michael Gorbach,[email protected]

许可证

有关更多信息,请参阅LICENSE文件。