2013-03-07 64 views
5

我有一个按钮按下时触发动画,动画完成后,更改标签的文本。我想写一个测试,验证按钮被按下后,标签的文本最终会正确更改。iOS TDD:测试使用UIVIEW的方法animateWithDuration:动画:完成:

执行按钮IBAction将使用[UIView animateWithDuration:animations:completion:]。我显然不希望我的单元测试等待0.5秒来完成动画。

我想过嘲笑UIView,但将UIView作为依赖项注入视图控制器看起来很奇怪。此外,我正在使用的嘲笑框架(OCMockito)似乎不适用于嘲笑类方法。

我也考虑过方法调试或编写UIView的测试类别,并使用一个实现除了调用animations:块和completion:块之外什么也不做。这对我来说似乎有点失败;我担心覆盖UIView上类方法的实现可能会产生意想不到的后果。

作为TDD的新手,我不确定最佳实践在这里。这是应该被视为“UI twiddling”的代码段之一,因此未经测试可以接受吗?还是有一些更明显的方式来测试我错过了吗?

回答

4

我只需制作一个属性即可确定动画的长度,并将其默认为0.5秒。

这样,您的测试可以将动画持续时间设置为0,并观察标签的文本已更新而无需等待。

这是dependency injection,如果你刚开始使用TDD,它非常有用。它还具有使代码更加模块化和更少耦合的良好副作用。

+0

对此很好奇:有没有保证测试完成之前动画会运行?这个动画片段会因某种原因而被推迟吗? – Ying 2013-03-07 21:19:30

+1

这实际上是一个很好的观点。动画将在runloop上排队,这通常意味着动画将在测试返回后发生。但是,持续时间<= 0的动画是一种特殊情况,会导致立即发生更改。 – 2013-03-07 21:26:58

+1

@Benoit将动画的持续时间设置为0或更少不会立即调用完成块。即使持续时间为0,也可能在下一次运行循环中调用该块。我所做的就是调用GCD延迟块内的断言。我做了一个单独的答案来解释我的解决方案。 – 2015-04-21 09:54:48

相关问题