使用 NSData dataWithContentOfURL 的单元测试方法



我正在开发一个iOS应用程序,我正在尝试通过测试驱动开发来实现它。我一直在阅读很多关于这个主题的文章,我在一本书中遇到的一件事是测试应该是快速、可重复和可靠的。因此,在为网络代码编写测试时,测试应该"模拟"网络,以便无论网络可用性如何都可以执行。

在我的代码中,我有一个方法,可以使用URL从互联网上检索图像,缩放它并使用NSData中的dataWithContentOfURL将其存储在文件系统中:

+ (void) getImage:(NSString *)imageUrl {
    UIImage *image = [UIImage imageWithData:
        [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]]];
    // Scale image
    // Save image in storage 
}

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

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

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

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

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

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

我想我也会说,保持测试快速、可靠和可重复是一个很好的目标,但如果你想做一个"慢"或"不是 1000% 可靠"的测试,那好吧。 一个为你提供价值的测试总比不写一个测试要好,因为你认为这是一个不够好的测试。

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

最新更新