我遇到了一些使用RSpec和Selenium/Capybara/SitePrism的Web自动化的问题。这与代码中出现的before :all和before :each子句的组合有关,特别是在我的spec_helper文件中。
到目前为止,我一直在针对一个规范文件运行rspec。每个规范文件都需要一个spec_helper文件,其中包括以下内容:
spec_helper.rb:
RSpec.configure do |config|
config.before(:all) do
# 1) Code to configure WebDriver and launch Browser is here
end
end由于各种原因,规范文件本身包含自己的before块。其中大多数都包含了如下内容:
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 :each和before :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自动化和速度的一个因素,我真的不想打开一个新浏览器并为每个描述登录,尽管我知道这将是将每个测试与其他测试分开的理想方法。我必须要这么做吗?
谢谢!
发布于 2014-03-18 19:58:32
为了解决https://stackoverflow.com/a/22489263/1008891尚未涵盖的部分问题,require方法将不会像https://stackoverflow.com/a/22489263/1008891中所描述的那样重新加载以前加载的任何文件。这与load方法形成了对比,该方法的作用就像在任何地方使用文件内容的“复制/粘贴”。
我并不是说如果您将所有requires更改为loads,您将得到与运行单个文件相同的结果,因为可能存在其他影响您所看到的行为的全局状态。
https://stackoverflow.com/questions/22488293
复制相似问题