单元测试以验证对象是否已取消分配

时间:2008-11-17 13:35:40

标签: objective-c cocoa unit-testing

我正在寻找的是一种以编程方式验证目标对象已被解除分配的方法。目前我在我希望观察的对象的dealloc方法中有一个NSLog语句。 单元测试框架来自Google Toolbox for the mac,它运行良好。我只是不确定如何构建这个特定的测试。

7 个答案:

答案 0 :(得分:2)

使用_GTMDevLog:

参见高级资料|单元测试记录on this page

有关DevLogNAssert的更多信息。

答案 1 :(得分:2)

你可以调动dealloc方法。见MethodSwizzling on CocoaDev;使用Leopard的新method_exchangeImplementations函数的现代方法(当前)靠近页面底部。

您的实现需要告诉您的测试用例对象它已被调用。一种方法是在文件中使用静态变量,其中定义了测试用例类和替换dealloc方法;您的测试方法将该变量设置为NO,然后释放该对象,然后断言该变量的值现在为真。

答案 2 :(得分:1)

我在C#/ .Net中做了类似的事情。我使用“WeakReference”来跟踪项目,并测试它不再存在(参见链接)。你能将这种方法转化为你的环境吗?

http://geekswithblogs.net/HouseOfBilz/archive/2008/11/11/writing-tests-to-catch-memory-leaks-in-.net.aspx

答案 3 :(得分:1)

在过去,我创建了一个变量,它通过递增构造函数中的值并在析构函数中递减它来计算已分配的给定类的对象数。单元测试只是在测试结束时检查变量是否为零。

答案 4 :(得分:0)

您是否可以在某种事件监视器服务中记录dealloc,以便测试代码可以使用该查询来查看dealloc是否已发生。显然你会按名称或id记录它,因为对象正在被释放...

答案 5 :(得分:0)

我可能天真,但不会对释放的单元测试由

组成
  • 分配对象,
  • 通过您要测试的方法解除分配,
  • 尝试从对象中调用某些内容,然后
  • 捕获异常并查看其类型是否正确?

答案 6 :(得分:0)

我编写了一个释放对象的函数,如果对象被释放,则返回YES

BOOL getsDeallocatedByReleasing(id object);

还有一个高级界面,你可以在一个块中运行任意代码,你将获得一个bool,指示给定类的对象是否已被释放:

BOOL classGetsDeallocated(Class c, void (^block)(void));

代码使用方法调配,它非常难看,绝对不是线程安全的,但它的工作原理。你可以在GitHub找到它,如果我发现任何错误,我会保持更新。


P.S。写完所有代码后(噢!),不可能在开始时添加一个retain,做任何你想做的事情,拆掉你正在检查的对象图并检查对象的保留计数?