现代用户界面,尤其是MacOS和iOS,具有大量"随意"动画 - 通过系统主要协调的简短动画序列显示的视图.
[[myNewView animator] setFrame: rect]
Run Code Online (Sandbox Code Playgroud)
偶尔,我们可能会有更精细的动画,有动画组和完成块.
现在,我可以想象这样的错误报告:
嘿 - myNewView出现的好动画在新版本中没有发生!
所以,我们希望单元测试做一些简单的事情:
但是,当然所有这些测试都必须易于编写,并且不能使代码变得更糟; 我们不想用大量的测试驱动的复杂性来破坏隐式动画的简单性!
那么,什么是TDD友好的方法来实现休闲动画的测试?
让我们举一个具体的例子来说明我们为什么要进行单元测试.假设我们有一个包含一堆WidgetViews的视图.当用户通过双击创建一个新的Widget时,它应该最初看起来很小且透明,在动画期间扩展到完整大小.
现在,我们确实不需要单元测试系统行为.但是有些事情可能会出错,因为我们犯了错误:
动画在错误的线程上调用,并且不会被绘制.但是在动画过程中,我们调用setNeedsDisplay,因此最终会得到小部件.
我们正在从废弃的WidgetControllers池中回收废弃的小部件.新的WidgetViews最初是透明的,但回收池中的某些视图仍然是不透明的.所以褪色不会发生.
在动画结束之前,在新窗口小部件上会启动一些额外的动画.结果,小部件开始出现,然后在它稳定下来之前开始猛拉和闪烁.
您对窗口小部件的drawRect:方法进行了更改,新的drawRect很慢.旧动画很好,但现在很糟糕.
所有这些都将在您的支持日志中显示为"创建窗口小部件动画不再起作用".我的经验是,一旦你习惯了动画,开发人员很难立即注意到一个不相关的变化打破了动画.这是单元测试的秘诀,对吧?
考虑以下C++方法:
class Worker{
....
private Node *node
};
void Worker::Work()
{
NSBlockOperation *op=[NSBlockOperation blockOperationWithBlock: ^{
Tool hammer(node);
hammer.Use();
}];
....
}
Run Code Online (Sandbox Code Playgroud)
在捕获"节点"时,块确切地捕获了什么?对于其他情况,块的语言规范http://clang.llvm.org/docs/BlockLanguageSpec.html是明确的:
在复合语句范围内使用的变量以正常方式绑定到块,但自动(堆栈)存储中的变量除外.因此,可以按照人们的预期访问函数和全局变量,以及静态局部变量.[考验我]
块的复合语句中引用的本地自动(堆栈)变量将作为const副本导入并捕获.
但在这里,我们是否捕获了当前的这个值?副本这个使用工人的拷贝构造函数?或者对节点存储位置的引用?
特别是,假设我们说
{
Worker fred(someNode);
fred.Work();
}
Run Code Online (Sandbox Code Playgroud)
当块运行时,对象fred可能不再存在.节点的价值是多少?(假设底层的Node对象永远存在,但是工作者来去.)
相反,我们写了
void Worker::Work()
{
Node *myNode=node;
NSBlockOperation *op=[NSBlockOperation blockOperationWithBlock: ^{
Tool hammer(myNode);
hammer.Use();
}];
....
}
Run Code Online (Sandbox Code Playgroud)
结果有何不同?
我无法使用XCode 4.6来标记来自测试人员和用户的OS X(非iOS)崩溃日志.崩溃日志无法拖入组织者,组织者不会显示来自〜/ Library/Logs/DiagnosticReports /的任何崩溃日志,尽管某些日志位于该目录中.
迪迪埃·马伦凡特评论了前一个线程 的XCode不是进口OS X崩溃日志是
底线非常简单.截至目前(Xcode 4.6),OS X崩溃日志无法导入Xcode.只有iOS的.
这是目前的状况吗?很难想象组织能够在没有有效方法来解析崩溃报告的情况下支持新的OS X软件.
运行XCode 4.6的分析器和新的clang编译器,我发出了警告
被调用的C++对象指针为空
即使是像保守的表达
- (BOOL) validate: (Node*) node
{
if (!self.hypertext) return YES;
return self.hypertext->HasNode(node);
}
Run Code Online (Sandbox Code Playgroud)
1)我怎样才能说服静态分析仪这是否得到了适当的保护?2)在某些情况下,我可能想断言指针不会为空.怎么样?
xcode ×2
animation ×1
block ×1
clang ×1
cocoa ×1
ios ×1
objective-c ×1
symbolicate ×1
tdd ×1
xcode4.6 ×1