gpt4 book ai didi

objective-c - 如何在 Objective-C 中对 init 方法进行单元测试?

转载 作者:行者123 更新时间:2023-12-04 00:40:11 25 4
gpt4 key购买 nike

我正在使用新的 XCTest 框架在 Xcode 5 中对 Mac 应用程序进行单元测试。具体来说,我正在尝试测试一个类是否实现了一个(尚未编写!)- (id)initWithStream:(NSInputStream)stream 方法。所以我开始了我的测试:

- (void)testInitWithStream
{
// Should have an init method named initWithStream:
XCTAssertTrue([[MYParser alloc]
respondsToSelector:@selector(initWithStream:)],
@"'initWithStream:' not implemented.");

哪个工作正常;测试目前按预期失败。这是下一部分,它试图运行尚未编写的方法,这让我很伤心:

  // 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.");

Xcode 给我错误消息“PerformSelector 命名了一个保留对象的选择器。”我正在使用 performSelector:withObject:,因为尝试直接调用选择器会导致错误“No visible @interface for 'MYParser' declares the selector 'initWithStream:'。”

我的测试套件已关闭 GCC_WARN_UNDECLARED_SELECTOR,但这些都是错误,而不是警告。当测试需要覆盖方法可能尚未实现(即使作为定义)的情况时,如何测试对象的 init 方法?

该方法可能尚未实现,因为我正在先编写测试;这是对的,还是我应该先写我的类定义,然后是我的测试,然后是实际的实现? (我正在寻求关于这一点的共识和最佳实践,而不仅仅是意见。)

最佳答案

如果您正在进行测试先行开发,则无需测试 respondsToSelector:@selector(initWithStream:)。在您的测试套件中直接调用 initWithStream: 一开始不会编译。这是您在编写新代码之前应该修复的失败测试。你如何解决它?通过实现方法:

- (instancetype)initWithStream:(id)stream {
return [super init];
}

您的测试现在可以编译,比以前好一点。但是,运行测试会失败,因为很明显,实现并没有完成您要测试的内容。现在编写更多代码使测试真正通过:

- (instancetype)initWithStream:(id)stream {
if (!stream) {
return nil;
}
return [super init];
}

接下来,您可以测试 stream 是否为 nil,这将失败,因此您可以编写更多代码来修复它。

关于objective-c - 如何在 Objective-C 中对 init 方法进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19671598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com