Cal*_*ion 2 xcode unit-testing objective-c xctest
我使用新的XCTest框架在Xcode 5中对Mac App进行单元测试.具体来说,我正在尝试测试一个类实现了一个(尚未写的!)- (id)initWithStream:(NSInputStream)stream方法.所以我开始测试了:
- (void)testInitWithStream
{
// Should have an init method named initWithStream:
XCTAssertTrue([[MYParser alloc]
respondsToSelector:@selector(initWithStream:)],
@"'initWithStream:' not implemented.");
Run Code Online (Sandbox Code Playgroud)
哪个工作正常; 测试目前按预期失败.这是下一部分,试图运行尚未成文的方法,这让我感到悲痛:
// Should return nil if no valid stream is passed
XCTAssertNil([[MYParser alloc]
performSelector:@selector(initWithStream:)
withObject:nil],
@"should get nil on 'initWithStream:' with no stream.");
Run Code Online (Sandbox Code Playgroud)
Xcode给出了错误"PerformSelector命名一个保留对象的选择器".我正在使用,performSelector:withObject:因为尝试直接调用选择器会导致错误"'MYParser'没有可见的@interface'声明选择器'initWithStream:'."
我的测试套件已GCC_WARN_UNDECLARED_SELECTOR关闭,但这些都是错误,而不是警告.当测试需要覆盖可能未实现该方法的情况时(即使作为定义),我如何测试对象的init方法呢?
该方法可能尚未实现,因为我正在编写我的测试; 这是对的,还是我应该首先编写我的类定义,然后是我的测试,然后是实际的实现?(我正在寻找关于这一点的共识和最佳实践,而不仅仅是意见.)
如果您正在进行测试首次开发,则无需进行测试respondsToSelector:@selector(initWithStream:).initWithStream:在您的测试套件中直接调用将首先不编译.这是您在编写新代码之前应该修复的失败测试.你是如何解决的?通过实施该方法:
- (instancetype)initWithStream:(id)stream {
return [super init];
}
Run Code Online (Sandbox Code Playgroud)
你的测试现在编译,这比以前好一点.但是,运行测试会失败,因为很明显,实现并不会执行您正在测试的内容.现在编写更多代码以使测试实际通过:
- (instancetype)initWithStream:(id)stream {
if (!stream) {
return nil;
}
return [super init];
}
Run Code Online (Sandbox Code Playgroud)
接下来,您可以测试stream不存在nil,哪个会失败,因此您需要编写更多代码来修复它.
| 归档时间: |
|
| 查看次数: |
1843 次 |
| 最近记录: |