I have a XCTestCase scenario using the following methodology:
- (void)testScript { NSError* error = nil; for (NSURL *scriptURL in [self findScriptFiles]) { // Read the entire file. NSString *text = [NSString stringWithContentsOfURL:scriptURL encoding:NSUTF8StringEncoding error:&error]; // Test each line. [text enumerateLinesUsingBlock:^(NSString *line, BOOL *stop) { XCTAssertTrue([self runInstruction:line]); }]; } }
This works, but I don't like it that all error messages are placed in the testScript source code, whereas they should really be placed inline in the parsed script.
I did a bit of digging in the XCTestCase framework headers and found the solution, using recordFailureWithDescription:inFile:atLine:expected:
- (void)testScript { NSError* error = nil; for (NSURL *scriptURL in [self findScriptFiles]) { // Read the entire file. NSString *text = [NSString stringWithContentsOfURL:scriptURL encoding:NSUTF8StringEncoding error:&error]; __block NSUInteger lineNum = 0; // Test each line. [text enumerateLinesUsingBlock:^(NSString *line, BOOL *stop) { lineNum++; if ([self runInstruction:line] == NO) { // Place the error marker in the parsed file! [self recordFailureWithDescription:@"Instruction failed" inFile:[self sourcePathForURL:scriptURL] atLine:lineNum expected:YES]; } }]; } }
NB. The scriptURL points to a file within the resources folder of the test target, i.e. not to the original script file in my Xcode project. I therefore need to locate the original script file, for instance relative to the current source file (whose name can be obtained through the __FILE__
preprocessor macro).