我有一个按钮按下时触发动画,动画完成后,更改标签的文本。我想写一个测试,验证按钮被按下后,标签的文本最终会正确更改。iOS TDD:测试使用UIVIEW的方法animateWithDuration:动画:完成:
执行按钮IBAction将使用[UIView animateWithDuration:animations:completion:]
。我显然不希望我的单元测试等待0.5秒来完成动画。
我想过嘲笑UIView,但将UIView作为依赖项注入视图控制器看起来很奇怪。此外,我正在使用的嘲笑框架(OCMockito)似乎不适用于嘲笑类方法。
我也考虑过方法调试或编写UIView
的测试类别,并使用一个实现除了调用animations:
块和completion:
块之外什么也不做。这对我来说似乎有点失败;我担心覆盖UIView上类方法的实现可能会产生意想不到的后果。
作为TDD的新手,我不确定最佳实践在这里。这是应该被视为“UI twiddling”的代码段之一,因此未经测试可以接受吗?还是有一些更明显的方式来测试我错过了吗?
对此很好奇:有没有保证测试完成之前动画会运行?这个动画片段会因某种原因而被推迟吗? – Ying 2013-03-07 21:19:30
这实际上是一个很好的观点。动画将在runloop上排队,这通常意味着动画将在测试返回后发生。但是,持续时间<= 0的动画是一种特殊情况,会导致立即发生更改。 – 2013-03-07 21:26:58
@Benoit将动画的持续时间设置为0或更少不会立即调用完成块。即使持续时间为0,也可能在下一次运行循环中调用该块。我所做的就是调用GCD延迟块内的断言。我做了一个单独的答案来解释我的解决方案。 – 2015-04-21 09:54:48