1

我正在开发一个 iOS 应用程序,我正在尝试通过测试驱动开发来完成它。我已经阅读了很多关于这个主题的内容,我在一本书中遇到的一个问题是测试应该是快速、可重复和可靠的。因此,在为网络代码编写测试时,测试应该“模拟”网络,以便无论网络可用性如何都可以执行它。

在我的代码中,我有一个方法可以使用 URL 从 Internet 检索图像,使用 NSData 中的 dataWithContentsOfURL 对其进行缩放并将其存储在文件系统中:

+ (void) getImage:(NSString *)imageUrl {

    UIImage *image = [UIImage imageWithData:
        [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]]];

    // Scale image
    // Save image in storage 
}

我的问题是:什么是测试这种方法的好方法,以便在代码正确时测试通过,在不正确时失败,而不考虑可能的网络故障?

目前在我的测试中,我忽略了该方法需要连接的事实,只是期望结果是正确的。但是,我已经看到当我的测试套件增长时这会成为一个问题,因为它们已经花费了相当长的时间来运行。更重要的是,我不希望我的测试仅仅因为没有良好的网络连接而失败,因为我相信这不是他们的目的。我很感激任何建议。

4

1 回答 1

1

您保持测试快速、可靠和可重复的意图是好的。消除对网络的依赖是帮助实现这些目标的好方法。

不要像现在这样被锁定在方法中,记住您尝试使用的工具称为测试驱动开发。测试不仅仅是一个包装器,以确保您的代码按照编写的方式工作。它是一种发现可以改进代码以使其更可测试、更可靠、可重用等方式的方法。

要消除网络依赖性,您可以考虑传递 URL(您的参数名称已经是 imageURL)而不是字符串。通过这种方式,您可以创建指向本地文件系统的 URL,而不是指向网络上的某个位置。

我还注意到您的方法确实做了很多工作。一个描述它真正在做什么的名字可能是 loadImageFromURLAndScaleItAndSaveItToDisk:。为什么不把它分解成几个更小、更可测试的方法呢?也许一种从 URL 加载图像,一种缩放图像,一种将图像保存到本地文件系统。您可以测试每个单独的部分,然后进行另一个单元测试,通过将其结果与按顺序调用较小方法的结果进行比较来测试您的原始方法。

我想我也会说保持测试快速、可靠和可重复是一个很好的目标,但如果你想做一个“更慢”或“不是 1000% 可靠”的测试,那没关系。为您提供价值的测试比不编写测试要好,因为您认为它不够好

我知道大部分都是一般性的,但我希望它有所帮助。

于 2013-10-09T01:54:14.060 回答