6

假设我有一些想在不同上下文或“功能”下测试的场景。

例如,我有涉及用户访问某些页面并期望某些 ajax 结果的场景。

但是,在不同的条件或“功能”下,我需要执行不同的“后台”任务来改变应用程序的状态。

在这种情况下,我需要一遍又一遍地运行相同的场景,以确保一切都适用于对应用程序状态的不同更改。

有没有办法在某个地方定义场景,然后重用它们?

4

1 回答 1

9

您可以使用共享示例创建可在多个功能中使用的可重用场景。

下面是一个来自 relishapp 页面的基本示例。如您所见,在多个特性中使用相同的场景来测试不同的类——即运行了 6 个示例。

require 'rspec/autorun'
require "set"

shared_examples "a collection" do
  let(:collection) { described_class.new([7, 2, 4]) }

  context "initialized with 3 items" do
    it "says it has three items" do
      collection.size.should eq(3)
    end
  end

  describe "#include?" do
    context "with an an item that is in the collection" do
      it "returns true" do
        collection.include?(7).should be_true
      end
    end

    context "with an an item that is not in the collection" do
      it "returns false" do
        collection.include?(9).should be_false
      end
    end
  end
end

describe Array do
  it_behaves_like "a collection"
end

describe Set do
  it_behaves_like "a collection"
end

relishapp 页面上有几个示例,包括使用参数运行共享示例(复制如下)。我猜想(因为我不知道您的确切测试)您应该能够在执行这组示例之前使用参数来设置不同的条件。

require 'rspec/autorun'

shared_examples "a measurable object" do |measurement, measurement_methods|
  measurement_methods.each do |measurement_method|
    it "should return #{measurement} from ##{measurement_method}" do
      subject.send(measurement_method).should == measurement
    end
  end
end

describe Array, "with 3 items" do
  subject { [1, 2, 3] }
  it_should_behave_like "a measurable object", 3, [:size, :length]
end

describe String, "of 6 characters" do
  subject { "FooBar" }
  it_should_behave_like "a measurable object", 6, [:size, :length]
end
于 2013-09-12T03:14:09.017 回答