在RSpec / Cucumber中进行特征测试时,如何避免膨胀,深度嵌套的块?

时间:2014-11-27 04:56:02

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

通常在RSpec / Cucumber中进行特征测试时,我想模拟一系列相关的过程用户操作。例如,用户可能会登录,然后更新个人资料,然后在网站上执行其他操作,然后退出,等等...

在RSpec中,类似的功能测试可能如下所示:

describe "Step 1: Sign in" do
  before do
    # Capybara logic
  end

  describe "Step 2: Visit settings page" do
    before do
    end

    describe "Step 3: Update profile" do
      before do
        # More Capybara/etc...
      end

      describe "Step 4: Making a new post" do
        before do
          # ......
        end

        describe "Step 5: Viewing inbox" do
          before do
            # ...
            # More nested code etc, etc, etc...
          end
        end


      end
    end
  end
end

然而,很明显,这种嵌套很快就会失控,尤其是在测试网站上的复杂行为时。此外,最外层嵌套中的“before”块比内部before块运行的次数多,不必要地减慢了测试套件的速度。

那么,是否有更优雅的方法可以解决这个问题?我可以使用shared_examples_forit_behaves_like,{{1}来轻松清理内容但是,当我想要做的就是在程序上运行测试而不需要每个测试都需要单独运行时,它似乎相当尴尬。换句话说,我正在寻找这样的测试DSL:

shared_context

是的,我知道原则上测试是孤立运行的,但是说实话,当测试中的每个步骤都依赖于先前测试的结果时,这样做并不总是切实可行的。

1 个答案:

答案 0 :(得分:1)

按需求分组时,规格工作得很好。它会干掉每个条件的设置/拆卸,并在您知道案例的时候轻松扫描,但不知道功能是什么。

例如:

describe "a logged in user" do
  before do
    # log in
  end

  describe "with 3 items" do
    before do
      # add 3 items
    end

    it "displays 3 items in the cart" do
    end
  end

  describe "with 0 items" do
    it "displays an empty cart" do
    end
  end
end

我不认为嵌套规范适用于描述实现(例如,首先执行此操作,然后执行此操作)。这似乎很快就爆发了