Ruby 想写一个网络抓取数据的程序,该怎么写 rspec 测试?

alphaliu · 2013年02月19日 · 最后由 wppurking 回复于 2013年02月21日 · 4085 次阅读

想测试这个程序是否能抓取到正确的数据之类的,rspec 测试怎么写合适?主要是考虑到网络上抓取到的数据每次可能都不同,怎么写才能测试出程序工作正常呢?初次使用 TDD 的方式写程序,请指教。

虚拟出一个网页。 就像测试 @time = Time.now 一样,既然无法直接测试 Time.now,那我在对象中直接插入一个实例变量来代替 Time.now

instance_eval{ @time = "2013-02-19" }

不知道你是否明白这个意思?

这样我倒是明白了。你说的这个@time = Time.now我有印象,是哪本书上说的?

先写一个目标 html 放在本地,然后直接读这个 html 看抓取内容是否正确 访问目标网站用另一个 case 写

#3 楼 @yesmeck 谢谢,跟我之前一直在考虑的一样,要用 mock 和 stub,不过因为不是很熟悉,所以都不知道怎么写。有这个 webmock 非常合适我的场景。

#3 楼 @yesmeck 这个 gem 不错 我一直也在想这种场景 怎么测试

我一直是直接给出返回的数据... 比如我用 HTTPClient 的 get 或是 post 方法,我直接把这些方法换掉,然后根据参数返回预先设置好的数据..

@AlphaLiu Ruby 元编程的扁平作用域

webmock+1

如果用 faraday 做客户端,也可以有简单的 mock 功能。

另外,可以把请求网络读取到返回数据,和解析处理数据分开。这样也 mock 返回数据的方法。

这个不适合 TDD 吧,抓网页主要问题是保持能抓到内容。我做这类的时候是这样做的,做找到要抓的页面,找到个页保存下来,去掉 tbody,然后程序测试能否抓下来。然后是列表页保存到当地,再测试能否抓到。

#9 楼 @wppurking 这应该是上下文探针,好像跟扁平化作用域没什么关系吧,对对象强行注入一个属性而已。

@neverlandxy_naix You are right. 我弄混了,多谢指正。:-)

需要 登录 后方可回复, 如果你还没有账号请 注册新账号