如何参数化RSpec测试,以便在稍微不同的条件下测试相同的行为

时间:2010-08-29 14:44:16

标签: ruby rspec

我正在实施一种服务,它有几种不同的访问方式:

  • 使用简单查询参数
  • 将参数编码为Javascript对象

对于某些调用,支持GET和POST,当有大量数据发送到服务时使用POST。

构建RSpec测试以避免不必要地重复代码的最佳方法是什么,允许我每次运行相同的基本断言?

我已经在使用shared_examples捕获一些评论测试,比如响应代码,mimetype等。但是我想知道是否还有其他选项,特别是当我想使用所有请求方法和范围来调用服务时预期的投入和产出。

1 个答案:

答案 0 :(得分:5)

在这种情况下我会这样做的方法是将请求指定为执行它的lambda。这样我可以在我的共享规范中引用它,并为每种类型的请求设置不同的。

我喜欢在设置期望时使用rspec describe块,在这种情况下使用特定的请求方法。整件事看起来像这样:

describe FooController do
  shared_examples_for "any request" do
    it "assigns foo" do
      @request.call
      assigns[:foo].should ==  "bar"
    end

    it "does not change the number of bars" do
      @request.should_not change(Bar, :count)
    end
  end

  context "using GET" do
    before do
      @request = lambda { get "index" }
    end

    it_should_behave_like "any request"
  end
end

更简洁的方法是使用'let'构造,尽管对于新手而言,它可能是rSpec魔法中的一个步骤:

describe FooController do
  shared_examples_for "any request" do
    it "assigns foo" do
      request.call
      assigns[:foo].should ==  "bar"
    end

    it "does not change the number of bars" do
      request.should_not change(Bar, :count)
    end
  end

  context "using GET" do
    let(:request) { lambda { get "index" } }

    it_should_behave_like "any request"
  end
end