失败的初始测试
  VVStackTests.m是Xcode在新建工程时自动为我们添加的测试文件。因为这个文件并不长,所以我们可以将其内容全部抄录如下:

 

#import<XCTest/XCTest.h>
@interfaceVVStackTests:XCTestCase
@end
@implementationVVStackTests
-(void)setUp
{
[supersetUp];
//Putsetupcodehere.Thismethodiscalledbeforetheinvocationofeachtestmethodintheclass.
}
-(void)tearDown
{
//Putteardowncodehere.Thismethodiscalledaftertheinvocationofeachtestmethodintheclass.
[supertearDown];
}
-(void)testExample
{
XCTFail(@"Noimplementationfor"%s"",__PRETTY_FUNCTION__);
}
@end

 

  可以看到,VVStackTests是XCTestCase的子类,而XCTestCase正是XCTest测试框架中的测试用例类。XCTest在进行测试时将会寻找测试target中的所有XCTestCase子类,并运行其中以test开头的所有实例方法。在这里,默认实现的-testExample将被执行,而在这个方法里,Xcode默认写了一个XCTFail的断言,来强制这个测试失败,用以提醒我们测试还没有实现。所谓断言,是判断输入的条件是否满足。如果不满足,则抛出错误并输出预先规定的字符串作为提示。在这个Fail的断言一定会失败,并提示没有实现该测试。另外,默认还有两个方法-setUp和-tearDown,正如它们的注释里所述,这两个方法会分别在每个测试开始和结束的时候被调用。我们现在正要开始编写我们的测试,所以先将原来的-testExample删除掉。现在再使用?U来进行测试,应该可以顺利通过了(因为我们已经没有任何测试了)。

  接下来让我们想想要做什么吧。我们要实现一个简单的栈数据结构,那么当然会有一个类来代表这种数据结构,在这个工程中我打算叫它VVStack。按照常规,我们可以新建一个Cocoa Touch类,继承NSObject并且开始实现了。但是别忘了,我们现在在TDD,我们需要先写测试!那么首先测试的目标是什么呢?没错,是测试这个VVStack类是否存在,以及是否能够初始化。有了这个目标,我们可以动手开始编写测试了。在文件开头加上#import "VVStack.h",然后在VVStackTests.m的@end前面加上如下代码:

 

- (void)testStackExist {
XCTAssertNotNil([VVStack class], @"VVStack class should exist.");
}
- (void)testStackObjectCanBeCreated {
VVStack *stack = [VVStack new];
XCTAssertNotNil(stack, @"VVStack object can be created.");
}

 

  当然是不可能通过测试的,而且甚至连编译都无法完成,因为我们现在根本没有一个叫做VVStack的类。简单的让测试通过的方法是在产品代码中添加VVStack类。新建一个Cocoa Touch的Objective-C class,取名VVStack,作为NSObject的子类。注意在添加的时候,应该只将其加入产品的target中: