我在一个spec文件中有几个测试,看起来非常相似(这是在一个描述块中):
let(:helpful_variable1) {Helpful.new}
let(:helpful_variable2) {Helpful2.new}
before(:all) do
login_and_authenticate
end
it 'should do x' do
do_this
do_that
do_x
validate_x
end
it 'should do y' do
do_this
do_that
do_x
do_y
validate_x
validate_y
end
it 'should do x twice' do
do_this
do_that
do_x_twice
validate_x_was_done_twice
end
显然这是高度抽象的,但实际文件在结构和函数调用方面看起来非常相似。这里有很多代码重复,但我似乎无法弄清楚干燥它的最佳方法是什么。重要的是要注意:
我考虑过使用shared_example或shared_context,但我并不了解它以及我在网上看过的例子,但我似乎无法理解它是否可以帮到我这里
当然,有一种更优雅的写作方式,虽然我不确定如何。 任何帮助表示赞赏!
谢谢
答案 0 :(得分:0)
这是上下文和块之前的经典案例。例如:
let(:helpful_variable1) {Helpful.new}
let(:helpful_variable2) {Helpful2.new}
before(:all) do
login_and_authenticate
end
context "when this and that" do
begin do
do_this
do_that
end
it 'should do x' do
do_x
validate_x
end
it 'should do y' do
do_x
do_y
validate_x
validate_y
end
it 'should do x twice' do
do_x_twice
validate_x_was_done_twice
end
end
现在,上下文也可以嵌套。
我不知道你要用do_x
做什么,它可能是一个断言......但假设它是另一个设置的东西,你也可以将它嵌套到相关的规格(而不是其他的规格) )...例如
let(:helpful_variable1) {Helpful.new}
let(:helpful_variable2) {Helpful2.new}
before(:all) do
login_and_authenticate
end
context "when this and that" do
begin do
do_this
do_that
end
context "and also X is done" do
before do
do_x
end
it 'validates x' do
validate_x
end
context 'twice...' do
before do
do_x # again
end
it 'validates x was done twice' do
validate_x_was_done_twice
end
end
context "and y is done" do
before do
do_y
end
it 'validates x and y' do
validate_x
validate_y
end
end
end
end