21

在尝试使用 XCTest 测试我的应用程序时,执行以下操作时出现构建错误:

#import <XCTest/XCTest.h>

@interface MyTests : XCTestCase

@end

@implementation MyTests

- (void)testExample
{
    NSString *str = @"foo";
    XCTAssertTrue(YES, str); // Parse issue: Expected ')'
}

@end

但如果我这样做,我不会收到构建错误:

#import <XCTest/XCTest.h>

@interface MyTests : XCTestCase

@end

@implementation MyTests

- (void)testExample
{
    XCTAssertTrue(YES, @"foo"); // this is just fine...
}

@end

我得到的构建错误是:

Parse issue: Expected ')' 

它在“str”中的“s”下放了一个箭头。

我发现我可以通过改变来解决这个问题

XCTAssertTrue(YES, str)

XCTAssertTrue(YES, @"%@", str)

但我就是不明白为什么会有所作为。有人可以解释为什么会这样吗?

4

3 回答 3

22

XCT...编写宏以接受格式字符串——字符串本身是可选的(因此写入是XCTAssertTrue(YES)有效的),但它们必须是常量字符串。如果没有格式字符串,您不能将对象传递到宏中,这就是为什么XCTAssertTrue(YES, @"%@", str)有效,但是,比如说,XCTAssertTrue(YES, str)或者XCTAssertTrue(NO, nil)不会。

于 2013-11-07T06:41:27.020 回答
4

在实现的深处,代码执行以下操作:

    @"" format

如果format是常量字符串文字,编译器将字符串连接起来。如果format是别的,你会得到一个编译器错误。

于 2013-11-07T19:35:21.670 回答
0

有时需要将预定义的文本传递到断言中,因此:

XCTAssertTrue(YES, @"foo"); // this is just fine...

就像这个

#define FOO @"foo"
XCTAssertTrue(YES, FOO); // this is just fine too...

所以我做这样的事情:

#define DBUEqualityTestFailed @"Equality test failed"

// test
DBNumber *n1 = [@((int)1) dbNumberFromIntValue];

XCTAssertTrue(*(int *)[n1 valuePointer] == 1, DBUEqualityTestFailed);
XCTAssertTrue([n1 valuePointer] == [n1 valuePointer], DBUEqualityTestFailed);
XCTAssertTrue(*(int *)[n1 valuePointer] == *(int *)[n1 valuePointer], DBUEqualityTestFailed);
于 2014-12-02T11:11:57.813 回答