在每个循环中产生自我到rspec测试产生最后已知状态

时间:2016-06-24 01:51:40

标签: ruby rspec

我正在为某些网页编写一些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时,最终发生的事情是测试将按照我的预期运行多次,但是每次它在最后一次迭代期间产生对象时它会运行访问。所以它并没有按照我想要的方式测试页面,而是测试列表中的最后一页。

我在这里错误地使用yieldself了吗?这似乎非常简单:将测试作为一个块传递给Page对象的测试方法,让它自己运行测试。

任何提示?我希望能够保持所有测试的清洁,以及页面对象中的所有逻辑,但这阻碍了我这样做。

1 个答案:

答案 0 :(得分:1)

在给定文件的范围内,RSpec示例/测试不会被执行,直到它们都被定义。您正在遍历定义所有这些示例的页面,但RSpec正在收集而不是执行它们,直到迭代完成,此时t的值保持不变并对应于页面的最终状态