菜鸟教程小白 发表于 2022-12-13 17:10:53

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


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

<p>而且我有点卡在对 dealloc 方法进行单元测试。</p>

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

<pre><code>-(void) dealloc{
;
myProperty = nil;
;
}
</code></pre>

<p>如何编写检查这种行为的单元测试?</p>

<p>显然,这不起作用:</p>

<pre><code>
STAssertNil(myObject.myProperty,@&#34;myProperty should be released and set to nil in dealloc&#34;)
</code></pre>

<p>有什么建议吗?
谢谢!</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>假设您可以执行上述操作,您实际上会测试什么?这是我的想法:</p>

<ol>
<li><p>测试 -release 会减少 retainCount</p></li>
<li><p>测试当 retainCount 达到零时 NSObject 的垃圾回收机制调用 -dealloc</p></li>
<li><p>测试调用 -dealloc 时释放 myProperty</p></li>
</ol>

<p>这是单元测试的错误粒度,第 1 点和第 2 点不是您要测试的业务 - 假设它是由 Apple 进行的单元测试。因此,上面唯一的单元测试是:</p>

<blockquote>
<p>testing that when -dealloc is called,
myProperty is released</p>
</blockquote>

<p>现在,这段代码(非常正确)没有任何逻辑,也不会产生任何输出。所以,我认为对它进行单元测试实际上是偏执和不必要的(类似于测试编译器是否实际工作)。</p>

<p>但如果我确实想测试它,我会这样做:</p>

<pre><code>OCMockObject *mockProperty = MOCK(NSObject);
[ release];
myObject.myProperty = mockProperty;
;
;
</code></pre>

<p>显然,您通常不应该直接调用-dealloc,但如果您想对-dealloc 进行单元测试,这正是您应该做的(或者它不是单元测试)。鉴于这是非常糟糕的做法,而且测试对您的帮助很小,我认为您不应该打扰。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何编写单元测试来检查我的属性是否在 iOS 上的 dealloc 中释放?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/5816929/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/5816929/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何编写单元测试来检查我的属性是否在 iOS 上的 dealloc 中释放?