干掉一些执行非常类似操作的Rspec

时间:2018-04-15 16:03:57

标签: ruby-on-rails ruby rspec rspec-rails

我在一个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

显然这是高度抽象的,但实际文件在结构和函数调用方面看起来非常相似。这里有很多代码重复,但我似乎无法弄清楚干燥它的最佳方法是什么。重要的是要注意:

  1. 首次测试X
  2. 第二次测试做X和Y
  3. 第三次测试做了两次X(但它必须在不同的测试中运行并且像这样运行因为测试了什么
  4. 我考虑过使用shared_example或shared_context,但我并不了解它以及我在网上看过的例子,但我似乎无法理解它是否可以帮到我这里

    当然,有一种更优雅的写作方式,虽然我不确定如何。 任何帮助表示赞赏!

    谢谢

1 个答案:

答案 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