2013-10-09 47 views
1

我正在开发iOS应用程序,我试图用测试驱动开发做到这一点。我一直在阅读关于这个问题的很多,我在book碰到的事情之一是,测试应该是快速,可重复和可靠。因此,在编写网络代码测试时,测试应该“模拟”网络,以便可以在网络可用性的情况下执行测试。单元测试方法与NSData的dataWithContentsOfURL

在我的代码,我有一个从互联网上获取的图像与URL,鳞片,并将其存储在使用dataWithContentsOfURL从NSData的文件系统的方法:

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

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

    // Scale image 
    // Save image in storage 
} 

我的问题是:什么是一种很好的方法来测试这种方法,以便在代码正确时通过测试,并在没有考虑到可能的网络故障时通过测试。

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

回答

1

你打算让你的测试快速,可靠和可重复的是好的。消除对网络的依赖是帮助实现这些目标的好方法。

而不是像现在一样被锁定在方法中,请记住您正在尝试使用的工具称为test-DRIVEN开发。测试不仅仅是一个包装,以确保你的代码能够像书面一样工作。它的一种方法,发现你的代码可以改进,使其更可测试,可靠,可重复使用等方式。

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

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

我想我也会说保持测试快速,可靠和可重复是一个好的目标,但是如果你想做一个'更慢'或'不是1000%可靠'的测试,那么好吧。提供到您的测试比不写一个测试,因为你不认为这是一个很好的足够测试更好。

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

+0

将URL传递到本地文件系统中的映像是解决我的问题的好方法,谢谢。 我的真实方法与您的建议非常相似,使用两个较小的方法来缩放和存储图像,我只是省略了代码,因为我认为它不相关(可能是这样)。 我会将方法的名称更改为在我的应用程序的上下文中更具描述性的方法。 –