我正在为某些网页编写一些rspec测试。其中一个页面包含几个我想作为一组测试的链接。所以我的测试看起来像这样
require 'spec_helper'
t = Page.new
t.test do |t|
describe 'a thing' do
it 'should not be last' do
t.title
end
end
end
所以,当我打电话给t.title
时,我实际上是在下面的Page对象上调用它(单独),而不是在下面。
我的Page对象看起来像这样
class Page
attr_accessor :driver
def initialize()
@driver = Watir::Browser.new :phantomjs
@home = ''
@driver.goto(@home)
end
def visit(url)
@driver.goto(url)
end
def title
@driver.title
end
def test
@subpages.each do |page|
visit(page)
yield self
end
end
end
所以现在当我运行rspec时,最终发生的事情是测试将按照我的预期运行多次,但是每次它在最后一次迭代期间产生对象时它会运行访问。所以它并没有按照我想要的方式测试页面,而是测试列表中的最后一页。
我在这里错误地使用yield
或self
了吗?这似乎非常简单:将测试作为一个块传递给Page对象的测试方法,让它自己运行测试。
任何提示?我希望能够保持所有测试的清洁,以及页面对象中的所有逻辑,但这阻碍了我这样做。
答案 0 :(得分:1)
在给定文件的范围内,RSpec示例/测试不会被执行,直到它们都被定义。您正在遍历定义所有这些示例的页面,但RSpec正在收集而不是执行它们,直到迭代完成,此时t
的值保持不变并对应于页面的最终状态