代码之家  ›  专栏  ›  技术社区  ›  AutomateFr33k

在rspec中进行特定测试后运行after块

  •  1
  • AutomateFr33k  · 技术社区  · 6 年前

    有没有方法可以使用标签在特定测试之后/之前运行after/before块?

    我有3个 it 阻碍

    describe "describe" do
    
      it "test1" do
      end
    
      it "test2" do
      end
    
      after(<<what goes here??>>) do
      end
    
    end
    

    如何仅在test2之后运行after块?有可能吗?

    3 回复  |  直到 6 年前
        1
  •  5
  •   Gavin Miller    6 年前

    你应该用 context 我们要这么做。类似于:

    describe "describe" do
      context 'logged in' do
        before(:each) do
          # thing that happens in logged in context
        end
    
        after(:each) do
          # thing that happens in logged in context
        end
    
        it "test1" do
        end
      end
    
      context 'not logged in' do
        # No before/after hooks here. Just beautiful test isolation
    
        it "test2" do
        end
      end
    end
    

    在before/after块中具有if/else条件是一种代码味道。别那样做。它只会让你的测试变得脆弱,容易出错,而且很难改变。

        2
  •  2
  •   Caleb Keene    6 年前

    最好的方法就是使用 context . 例如:

    describe "AutomateFr33k's fr33ky tests" do
    
      it "runs test1" do
        expect(true).to be_true
      end
    
      context "do something afterwards" do
        after { puts "running something after test2!" }
    
        it "runs test2" do
          expect(5).not_to eq(4)
        end
      end
    end
    
        3
  •  0
  •   Subash    6 年前

    是的,你可以,看看 here

    你可以通过使用 metadata 在RSPEC中

    RSpec.configure do |config|
      config.treat_symbols_as_metadata_keys_with_true_values = true
    end
    
    describe "Skip hook demo" do
      # If prior to RSpec 2.99.0.beta1
      after do
        puts "before hook" unless example.metadata[:skip]
      end
    
      # If RSpec 2.99.0.beta1 or later
      after do |example|
        puts "before hook" unless example.metadata[:skip]
      end
    
      it "will use before hook" do
      end
    
      it "will not use before hook", :skip do
      end
    end