在尝试使用XCTest测试我的应用程序时,执行以下操作时出现构建错误:
#import <XCTest/XCTest.h>
@interface MyTests : XCTestCase
@end
@implementation MyTests
- (void)testExample
{
NSString *str = @"foo";
XCTAssertTrue(YES, str); // Parse issue: Expected ')'
}
@end
Run Code Online (Sandbox Code Playgroud)
但如果我这样做,我不会得到构建错误:
#import <XCTest/XCTest.h>
@interface MyTests : XCTestCase
@end
@implementation MyTests
- (void)testExample
{
XCTAssertTrue(YES, @"foo"); // this is just fine...
}
@end
Run Code Online (Sandbox Code Playgroud)
我得到的构建错误是:
Parse issue: Expected ')'
Run Code Online (Sandbox Code Playgroud)
它在"str"中的"s"下面放了一个箭头.
我发现我可以通过改变来解决这个问题
XCTAssertTrue(YES, str)
Run Code Online (Sandbox Code Playgroud)
至
XCTAssertTrue(YES, @"%@", str)
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚为什么会产生影响.有人可以解释为什么会这样吗?
我的 UI 上有一个空文本字段,但它foo在情节提要中设置了一个占位符文本(其值为)。在我的 UI 测试中,我试图检查它的文本值是否以空开始,但是当我查询它的值时,它似乎给了我占位符值:
func testTextFieldInitiallyEmpty {
let input = XCUIApplication().textFields["My Text Field"]
XCTAssertEqual(input.value as! String, "")
}
Run Code Online (Sandbox Code Playgroud)
由于测试失败并显示此消息:
XCTAssertEqual 失败:("foo") 不等于 ("")
当然,foo是占位符值,但它不是该文本字段的文本值。如果我写了这样的错误信息,我会预料到:
XCTAssertEqual(input.placeholderValue as! String, "")
Run Code Online (Sandbox Code Playgroud)
input是 a XCUIElement,它实现了XCUIElementAttributes,所以我看不到其他任何东西可以在这里起作用。
如何检查(断言)文本字段为空?

做一些进一步的研究和尝试以下使用的建议后input的的性能accessibilityValue,label以及title,我还没有找到任何解决方案,这将使我的文本字段的文本值时,有文字,和一个空字符串时,只有占位符是可见的。
这似乎是 (a) 一个错误,或 (b) 来自测试框架的一个有问题的设计决策,不提供这种能力。至少,XCUIElementAttributes#value的文档对我来说似乎不够,因为唯一的细节是:
值的确切类型因元素类型而异。
仍在寻找更好的解决方案......
我有一个包含可能不同类的对象的数组,例如:
NSArray *multiClassArray = @[@"foo", @42, @"bar"];
Run Code Online (Sandbox Code Playgroud)
我想得到一个新数组,其中包含multiClassArray其类的所有对象,比如说NSString.
有没有比循环每个项更优雅的方法multiClassArray,检查它的类,并适当地将它存储在一个新的数组中?