我正在尝试使用XCode 7的XCTest UI测试功能创建一个树木漫步者,该功能系统地探索表视图的确定性树到指定的深度.它几乎可以工作,除了我无法可靠地检测任何给定元素上的点击是否实际上触发了到新屏幕的转换.我有工作的时间,这是检测无论是导航栏标签已更改或菜单元素的数量变化最大哈克方法.
第一个测试有假阴性,因为连续的屏幕可以有相同的导航栏标签(我走的代码库不是我的).第二个测试具有误报,因为有时单击表元素不会转换到另一个表/屏幕,而是向当前屏幕添加额外的元素.
在做了一些阅读之后,似乎使用可访问性标签可能是最佳选择.所以我设置为(在viewDidAppear)的应用程序代码的导航栏的辅助功能标签UID和然后在UI测试代码测试它.感觉这应该工作,但我只在测试代码中获得nil值.
我会自由地承认,在UI测试方面我是一个菜鸟,主要是切割/粘贴/调整其他人的代码,而不清楚我正在做什么.所以我可能在可访问性标签代码本身中做出某种天真的错误,并且可能在概念层面上检测到屏幕已经改变; 也许我可以做的事情更简单/更惯用.
在申请中:
- (void)viewDidAppear: (BOOL)animated {
[super viewDidAppear: animated];
//...
UINavigationBar* navBar = self.navigationController.navigationBar;
if( navBar )
{
static NSInteger s_UID = 0;
navBar.topItem.accessibilityLabel = [NSString stringWithFormat:@"UID-%ld", s_UID++];
}
}
Run Code Online (Sandbox Code Playgroud)
在XCTest UI测试中:
- (NSString*) navBarAccessibilityLabel: (XCUIApplication*) app
{
NSString* result = NULL;
XCUIElementQuery *navBars = app.navigationBars;
XCUIElement* firstElem = [navBars.staticTexts elementBoundByIndex:0];
if( firstElem )
{
result = (NSString*)firstElem.accessibilityLabel; // This is always nil
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
请注意,firstElem IS被发现,并且我能够非常愉快地从中提取例如firstElem.label.
任何帮助赞赏.
在任何地方的IDE中,没有什么比这个行为更让我生气。我已经寻找了一种停止它的方法,但是在任何地方都找不到它。我一直不得不手动删除这些愚蠢的自动提供的右括号,以至于即使使用精心设计的IDE,我现在也开始自动将其作为反射。
我有一个我希望多次使用的 lambda,但我希望它第二次至少对一个不同的(捕获)变量进行操作。这种方法 - 在调用代码中重定向到不同变量的 lambda 中使用捕获的指针 ref - 一种正常/明智的方法吗?或者我应该使用单独的机制,还是完全不同的方法?
MyStruct ms1;
MyStruct* pActiveMyStruct = &ms1;
auto lambda = [&]( const Foo& foo, u32 index )
{
pActiveMyStruct->sScore = foo.m_Score;
pActiveMyStruct->DoSomethingWith( index );
};
pProcessor->ApplyLambdaOn( lambda );
MyStruct ms2;
pActiveMyStruct = &ms2;
pProcessor->ApplyLambdaOn( lambda );
Run Code Online (Sandbox Code Playgroud)