the*_*lus 10 ruby testing rspec ruby-on-rails capybara
这是我的一部分spec_helper.rb:
RSpec.configure do |config|
config.before(:each) do
login(email, password)
visit root_url
end
end
Run Code Online (Sandbox Code Playgroud)
我需要的所有(20+)测试除了一个.
有没有办法避免单个测试执行before hook?
Joh*_*son 18
您可以向不需要登录的测试添加元数据,然后在before钩子中评估该元数据.
例如,在同一文件中进行两次测试.一个需要登录,一个不需要.
# foo_spec.rb
describe Foo do
describe "#bar" do
it "needs to log in" do
expect(1).to eq 1
end
end
describe "#baz" do
it "needs to not log in", :logged_out do
expect(1).to eq 1
end
end
end
Run Code Online (Sandbox Code Playgroud)
所以我们在it块中添加了元数据.接下来,我们配置before钩子来评估示例的元数据.
config.before(:each) do |test|
login(email, password) unless test.metadata[:logged_out]
visit root_url
end
Run Code Online (Sandbox Code Playgroud)
现在,每个测试都会,visit root_url但只有未标记的测试:logged_out才会调用login.
RSpec调用这些基于元数据的钩子过滤器.您可以在这里了解更多相关信息.
将这种代码放入规范助手似乎有点奇怪。功能规格是你的全部?没有单元测试?即使是前者,也要将该代码复制到需要它的各个规范中。如果它们都在同一个文件中,您可以使用上下文来防止某些重复。
RSpec.describe 'something' do
context 'specs with login' do
before do
login(email, password)
visit root_url
end
it { ... }
end
context 'specs without login' do
it { ... }
end
end
Run Code Online (Sandbox Code Playgroud)
spec_helper.rb 中的全局 rspec 配置用于其他用途。对每个规范都有意义的那些。例如,清理数据库。
config.before :each do
DatabaseCleaner.clean
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3597 次 |
| 最近记录: |