ios - 如何编写一个单元测试来检查我的属性是否在 iOS 上的 dealloc 中释放?

标签 ios unit-testing tdd dealloc

我对 TDD 和单元测试还很陌生,我正在一个业余项目中尝试一下。

我有点陷入对 dealloc 方法进行单元测试的困境。

我们都知道释放自定义属性并在 dealloc 中将它们设置为 nil 是一个很好的做法:

-(void) dealloc{
  [myProperty release];
  myProperty = nil;
  [super dealloc];
}

我如何编写一个单元测试来检查此行为?

显然,这是行不通的:

[myObject release]
STAssertNil(myObject.myProperty,@"myProperty should be released and set to nil in dealloc")

有什么建议吗? 谢谢!

最佳答案

假设您可以执行上述操作,您实际上会测试什么?我的想法是这样的:

  1. 测试 -release 是否会减少保留计数

  2. 测试当retainCount达到零时NSObject的垃圾收集机制调用-dealloc

  3. 测试调用 -dealloc 时是否释放 myProperty

对于单元测试来说,这是错误的粒度,第一点和第二点不是你要测试的事 - 假设它是由苹果进行单元测试的。因此,上面唯一的单元测试是:

testing that when -dealloc is called, myProperty is released

现在,这段代码(完全正确)没有任何逻辑,也不会产生任何输出。因此,我认为单元测试实际上是偏执和不必要的(类似于测试编译器是否实际工作)。

但是如果我确实想测试它,我会这样做:

OCMockObject *mockProperty = MOCK(NSObject);
[[mockProperty expect] release];
myObject.myProperty = mockProperty;
[myObject dealloc];
[mockProperty verify];

显然,您通常不应该直接调用 -dealloc,但如果您想对 -dealloc 进行单元测试,这正是您应该做的(或者它不是单元测试)。鉴于这是极其糟糕的做法,而且测试对你的帮助很小,我认为你不应该打扰。

关于ios - 如何编写一个单元测试来检查我的属性是否在 iOS 上的 dealloc 中释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5816929/

相关文章:

iphone - iPhone应用程序在首次运行/安装(apns?)时崩溃,但在…日志附加后还可以

ios - UISearchBar 问题中的取消按钮

iOS:为某些 View Controller 显示相同的 "Please sign-in"屏幕,然后将其更改为真实内容?

c# - 在单元测试中模拟 IHttpContextAccessor

c++ - Visual C++ 团队测试问题

c# - AuthorizeAttribute 的 IsAuthorized 在单元测试中始终为 false

tdd - 单元测试安装程序

android - Iphone 源代码可用于开发相同的 android 应用程序吗?

unit-testing - 功能复杂的TDD如何应用?

c# - 如何检查控件上是否设置了工具提示