首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RSpec -如何嵌套前:所有和以前:每个块相互作用?

RSpec -如何嵌套前:所有和以前:每个块相互作用?
EN

Stack Overflow用户
提问于 2014-03-18 18:43:50
回答 2查看 2.5K关注 0票数 2

我遇到了一些使用RSpec和Selenium/Capybara/SitePrism的Web自动化的问题。这与代码中出现的before :allbefore :each子句的组合有关,特别是在我的spec_helper文件中。

到目前为止,我一直在针对一个规范文件运行rspec。每个规范文件都需要一个spec_helper文件,其中包括以下内容:

代码语言:javascript
运行
复制
spec_helper.rb:
  RSpec.configure do |config|
    config.before(:all) do
      # 1) Code to configure WebDriver and launch Browser is here
    end
  end

由于各种原因,规范文件本身包含自己的before块。其中大多数都包含了如下内容:

代码语言:javascript
运行
复制
test_a_spec.rb:
  describe "Page A" do
    before :all do
      # 2) Log in to web site, maybe load the test page in question
    end
    it "does this thing" do
      # 3) Test this thing
    end
    it "does that thing" do
      # 4) Test that thing
    end
  end

只要我对单个规范文件运行RSpec,就可以正常工作。当我试图标记我的一些例子,然后运行到整个规范文件夹,我遇到了一个问题。before :all块在spec_helper.rb中并没有像我所想的那样为每个文件进行调整,而是在一开始运行了一次。第一个规范文件之后的所有规范文件都期望由spec_helper启动一个干净的浏览器,并部分地自己执行日志操作,但是浏览器并不干净,并且已经登录,所以这不是很好。

spec_helper.rb中的spec_helper.rb更改为before :each似乎是一种自然的解决方案,所以我做到了,并且突然间,我的测试失败了,因为声称是rack-test requires a rack application, but none was given的错误导致了失败。这发生在我的一些测试中,但不是全部,通过消除过程,我意识到只有测试有自己的before :all块失败。似乎规范文件中的before :all正在取代spec_helper文件中的before :each。因此,在启动浏览器之前,该公司正试图登录。

这让我很烦。我非常生气。我假设了两件事:

  • 我认为before :eachbefore :all是平等的,实际上,从某种意义上说,我可以想象它就像一个before :all加更多。在我看来,before :all取代before :each的想法似乎很奇怪。
  • 我假设所有这些before块都是以合理的方式嵌套的。也就是说,before :all块应该在其下面的所有东西之前触发一次,这意味着在可能包含before :all块的before :each块的每一次迭代中触发。另外,如果一个before :each包含一些代码,然后它下面的描述语句有一个before :all,那么before :each代码仍然应该在before :all代码之前触发。也许确实是这样的,我只是不确定。

问题:

1)我的spec_helper文件实际产生了什么样的行为?例如,如果我采取同样的行为并将其放入其中一个规范文件中,那会是什么样子?带有浏览器启动代码的before :each会将规范文件中的所有代码包装在某种隐式describe块中吗?before :each是否被插入到最外层的描述块中,因此必须与规范文件的before :all块竞争?

2)我可以通过放弃测试中的所有before :all块来“解决”这个问题,但我喜欢这种方式的灵活性,而且由于这是UI自动化和速度的一个因素,我真的不想打开一个新浏览器并为每个描述登录,尽管我知道这将是将每个测试与其他测试分开的理想方法。我必须要这么做吗?

谢谢!

EN

Stack Overflow用户

发布于 2014-03-18 19:58:32

为了解决https://stackoverflow.com/a/22489263/1008891尚未涵盖的部分问题,require方法将不会像https://stackoverflow.com/a/22489263/1008891中所描述的那样重新加载以前加载的任何文件。这与load方法形成了对比,该方法的作用就像在任何地方使用文件内容的“复制/粘贴”。

我并不是说如果您将所有requires更改为loads,您将得到与运行单个文件相同的结果,因为可能存在其他影响您所看到的行为的全局状态。

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22488293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档