Iphone iOS TDD:测试使用UIVIew animateWithDuration:动画:完成的方法:

Iphone iOS TDD:测试使用UIVIew animateWithDuration:动画:完成的方法:,iphone,ios,objective-c,tdd,Iphone,Ios,Objective C,Tdd,我有一个按钮按下,发射了一个动画,并在动画完成后,改变了标签的文本。我想写一个测试来验证当按下按钮时,标签的文本最终会正确地改变 按钮按下iAction的实现将使用[UIView animateWithDuration:animations:completion:][/code>。我显然不希望我的单元测试实际等待0.5秒动画才能完成 我曾想过模拟UIView,但将UIView作为依赖项注入视图控制器似乎有些奇怪。此外,我正在使用的模拟框架(OCMockito)似乎不适合模拟类方法 我还考虑了方法

我有一个按钮按下,发射了一个动画,并在动画完成后,改变了标签的文本。我想写一个测试来验证当按下按钮时,标签的文本最终会正确地改变

按钮按下iAction的实现将使用
[UIView animateWithDuration:animations:completion:][/code>。我显然不希望我的单元测试实际等待0.5秒动画才能完成

我曾想过模拟UIView,但将UIView作为依赖项注入视图控制器似乎有些奇怪。此外,我正在使用的模拟框架(OCMockito)似乎不适合模拟类方法

我还考虑了方法swizzling或为
UIView
编写一个测试类别,并使用一个只调用
动画:
块,然后调用
完成:
块的实现。这对我来说似乎有点破碎;我担心在UIView上重写类方法的实现可能会产生意想不到的后果


作为TDD的新手,我不确定这里的最佳实践是什么。这是一段应该被视为“UI玩弄”的代码,因此可以不测试吗?或者有什么更明显的方法来测试我缺少的吗?

我只需创建一个属性来确定动画的长度,并将其默认为0.5秒

这样,您的测试可以将动画持续时间设置为0,并观察标签的文本是否在不等待的情况下更新


这是非常有用的,如果你只是从TDD开始。它还有一个很好的副作用,就是使代码更模块化,耦合更少。

对此感到好奇:是否有保证在测试完成之前运行动画?这个动画块会因为某种原因被延迟吗?这其实是一个很好的观点。动画将在runloop上排队,这通常意味着动画将在测试返回后发生。但是,使用@Benoit设置动画持续时间为0或更小的动画不会立即调用完成块。即使持续时间为0,它也可能在下一次运行循环中调用该块。我所做的是调用GCD延迟块中的断言。我做了一个单独的回答来解释我的解决方案。