KZAsserts 1.2.1

KZAsserts 1.2.1

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最新版本2023年2月

Krzysztof ZablockiKrzysztof Zabłocki维护。



KZAsserts 1.2.1

KZAsserts - roids上的断言,轻松测试您的所有假设。

Version Platform

我们可以以许多方式提高我们代码库的质量,断言就是其中之一。然而,真正使用断言的人寥寥无几,这是为什么?

断言用来确保特定条件是真的,因为我们的应用程序并不存在于真空中,我们通常与其它API(或我们自己的API)进行交互,我们需要确保我们对它的假设确实是有效的,否则我们可能会遇到一些真正奇怪的错误。

如果我们的假设错误,断言将在检查该条件的行上崩溃,这样我们就可以迅速找到代码中的错误。

这是一个极好的概念,早崩溃,多崩溃,这使得编写干净且无错误的代码变得容易。

然而,发布版本应尽量避免崩溃,除非你喜欢一星的评分?

正因为如此,普通的断言是不够的,您需要确保即使在发布版本中,代码也能处理错误,如果您只是从发布版本中删除断言,您的假设错误时依然会崩溃(例如,在删除断言后,您将拥有类型不匹配等错误的代码)!

如果要对有关服务器API响应的所有假设进行断言,那会多好啊,这样如果后端发生变化,您会立即知道并且可以修复您的代码。所以人们最终会得到类似以下内容:

NSParameterAssert([dataFromServer isKindOfClass:[NSDictionary class]]);
if ([dataFromServer isKindOfClass:[NSDictionary class]]) {
  //! create NSError, handle it
}

NSParameterAssert([something isKindOfClass:[NSString class]]);
if ([something isKindOfClass:[NSString class]]) {
  //! create NSError, handle it
}

显然,他们可以将这个条件存储一次,并在断言和if语句中重用,但这仍然很糟糕!

现在想象一下测试整个响应格式,这将变得非常不必要且难以阅读。

这正是我大约两年前创造KZAsserts的原因,它可能看起来是这样的:

AssertTrueOrReturnError([dataFromServer isKindOfClass:[NSDictionary class]]);
AssertTrueOrReturnError([something isKindOfClass:[NSString class]]);

在调试模式下这会导致崩溃,但在发布版中它会自动为您生成 NSError,然后从当前作用域返回该错误对象。它还可以将消息记录到您的日志器/服务器/控制台:IMAGE

不仅如此,您可能在您的应用中编写了很多异步代码?KZAsserts可以轻松处理这一点

- (void)downloadFromURL:(NSURL*)url withCompletion:(void (^)(NSData *, NSError *))completionBlock
{
	AssertTrueOrReturnNilBlock([something isKindOfClass:[NSString class]], ^(NSError *error) {
  		completionBlock(nil, error);
	});
	//! ...
}

有了这些宏,您现在可以断言所有假设。我还鼓励您使用断言来强制API契约:例如,如果您有一个下载NSData *的方法,并且结果只能通过完成块获取,您应该断言确实存在一个完成块。否则,您正在浪费用户的电池/网络。

断言宏

KZAsserts提供以下断言

  AssertTrueOr[X](condition) - if condition fails to be true, on debug builds it will crash by using Assertion, on Release builds it calls error creation and perform specific action. Asserts with block param will execute ^(NSError *){} passed in block with auto-generated NSError.

  AssertTrueOrReturnError
  AssertTrueOrReturnErrorBlock

  AssertTrueOrReturn
  AssertTrueOrReturnBlock

  AssertTrueOrReturnNo
  AssertTrueOrReturnNoBlock

  AssertTrueOrReturnNil
  AssertTrueOrReturnNilBlock

  AssertTrueOrContinue
  AssertTrueOrContinueBlock

  AssertTrueOrBreak
  AssertTrueOrBreakBlock

  AssertTrueOrIgnore
  AssertTrueOrIgnoreBlock

安装

KZAsserts可通过CocoaPods获取,支持macOS、iOS和tvOS,要安装它,请将以下行添加到您的Podfile中

pod "KZAsserts"

提供自定义 NSError 创建函数

如果您想使用自己的 NSError 创建函数,只需在 applicationDidFinishLaunching 上方添加以下行

[KZAsserts registerErrorFunction:myErrorCreationFunction];

您还可以通过定义自己的 KZAMakeError 宏来更改整个日志格式。

调试期间的测试断言流程

在调试版本中,断言会导致程序中止,我们有时想快速查看发布版中会发生什么。如果您添加了带动作的符号断点,您可以检查它

+[KZAsserts debugPass:]    p shouldPass = YES

要复制粘贴符号和动作

+[KZAsserts debugPass:]
p shouldPass = YES

作者

Krzysztof Zablocki, @merowing_ 我的博客

许可

KZAsserts 在 MIT 许可下可用。有关更多信息,请参阅 LICENSE 文件。