Iphone iOS TDD:测试使用UIVIew animateWithDuration:动画:完成的方法:
我有一个按钮按下,发射了一个动画,并在动画完成后,改变了标签的文本。我想写一个测试来验证当按下按钮时,标签的文本最终会正确地改变 按钮按下iAction的实现将使用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)似乎不适合模拟类方法 我还考虑了方法
[UIView animateWithDuration:animations:completion:][/code>。我显然不希望我的单元测试实际等待0.5秒动画才能完成
我曾想过模拟UIView,但将UIView作为依赖项注入视图控制器似乎有些奇怪。此外,我正在使用的模拟框架(OCMockito)似乎不适合模拟类方法
我还考虑了方法swizzling或为UIView
编写一个测试类别,并使用一个只调用动画:
块,然后调用完成:
块的实现。这对我来说似乎有点破碎;我担心在UIView上重写类方法的实现可能会产生意想不到的后果
作为TDD的新手,我不确定这里的最佳实践是什么。这是一段应该被视为“UI玩弄”的代码,因此可以不测试吗?或者有什么更明显的方法来测试我缺少的吗?我只需创建一个属性来确定动画的长度,并将其默认为0.5秒
这样,您的测试可以将动画持续时间设置为0,并观察标签的文本是否在不等待的情况下更新
这是非常有用的,如果你只是从TDD开始。它还有一个很好的副作用,就是使代码更模块化,耦合更少。对此感到好奇:是否有保证在测试完成之前运行动画?这个动画块会因为某种原因被延迟吗?这其实是一个很好的观点。动画将在runloop上排队,这通常意味着动画将在测试返回后发生。但是,使用@Benoit设置动画持续时间为0或更小的动画不会立即调用完成块。即使持续时间为0,它也可能在下一次运行循环中调用该块。我所做的是调用GCD延迟块中的断言。我做了一个单独的回答来解释我的解决方案。