iOS TDD: 测试使用UIVIew animateWithDuration:animations:completion:方法的函数

7
我有一个按钮按下后会触发动画,当动画完成时,它会更改标签的文本。我想编写一个测试来验证当按钮被按下时,标签的文本是否正确更改。
按钮按下的实现将使用[UIView animateWithDuration:animations:completion:]。显然,我不希望我的单元测试真的等待0.5秒钟才能完成动画。
我考虑过模拟UIView,但是将UIView注入到视图控制器中似乎很奇怪。此外,我正在使用的模拟框架(OCMockito)似乎无法很好地模拟类方法。
我还考虑过方法交换或编写用于UIView的测试类别,并使用什么都不做的实现来调用animations:块,然后是completion:块。这对我来说有些不可靠;我担心覆盖UIView上的类方法实现可能会产生意想不到的后果。
作为TDD的新手,我不确定这里的最佳实践是什么。这是应该被认为是“UI调整”代码的一部分,因此可以接受未经测试吗?或者我是否忽略了一些更明显的测试方法?
1个回答

5
我会简单地创建一个属性来确定动画的长度,并将其默认设置为0.5秒。
这样,您的测试可以将动画持续时间设置为0,并观察标签的文本更新而无需等待。
这就是依赖注入,如果您刚开始使用TDD,它非常有用。它还具有使代码更模块化和减少耦合的良好副作用。

对此很好奇:是否有保证动画会在测试完成之前运行?这个动画块是否可能因某种原因被延迟? - Ying
1
这实际上是一个很好的观点。动画将排队在运行循环上,这通常意味着动画将在测试返回后发生。然而,使用持续时间小于等于0的动画是一种特殊情况,会导致更改立即发生。 - Ben S
1
@Benoit 将动画的持续时间设置为0或更少并不会立即调用完成块。即使持续时间为0,它可能会在下一个运行循环中调用该块。我的做法是在GCD延迟块内调用断言。我另外写了一个答案来解释我的解决方案。 - Ikhsan Assaat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接