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 に答える