RSpec:我如何将模块混合到RSpec测试中?

时间:2013-12-11 16:36:03

标签: ruby-on-rails rspec mixins

在我的应用中,当用户分享他评分增长的内容时。当他试图分享两次 - 他将不会获得第二次尝试的额外评级。对于应用程序,共享回调是由客户端用JS触发的,因此,它只是一个常规的GET请求。所以,我需要测试这个功能。这很简单。但我有几个部分有这种行为。该部分的每个控制器都有名为“rating_from_share”的方法,因此测试非常相似。我认为最好在混合中提取测试并将它们包含在应该的位置,但我无法弄清楚,我该怎么做。 那么,将RSpec与RSpec混合测试包含在内是真的吗?也许某种元编程可以解决这个问题?

P.S。 “rating_from_share”方法的实现并不是真的相同而只是输出结果,所以我不能将它聚合到一个超类并在这里测试它们。

编辑:

根据Vimsha的回答,我应该这样做吗?

Module Share
  def share
    it 'should be fun'
      expect(@fun.isFun?).toBe == 'yup' # the @fun is declared in ShareTest
    end
  end
end

describe "Share Test" do
   extend Share
   before :each do
     @fun = Fun.new
   end
   it 'should do test' do
     share # call method from Share module, which has real RSpec code?
   end
end

代码就是在这里编写的,我只想尝试一下。

4 个答案:

答案 0 :(得分:4)

RSpec的一个常见做法是将此类逻辑存储在spec/support下。例如:

# spec/support/ratings_macros.rb
module RatingsMacros
  ...
end

然后,您需要从spec_helper

加载它
# spec/spec_helper.rb
...
RSpec.configure do |config|
  ...
  config.include RatingsMacros

现在,您可以在测试中调用RatingsMacros模块中定义的所有方法。

答案 1 :(得分:4)

您可以使用shared examples

这些通常保存在spec/support下,并通过spec_helper.rb加载。请务必阅读文档以了解如何加载共享代码 - 它不会自动为您执行。

一旦定义了它们,你就可以这样包括它们:

# spec/support/decorated_model.rb
shared_examples "decorated_model" do
  it "can be decorated" do
    subject.should respond_to?(:decorate)
  end
end

# my_class_spec.rb
describe MyClass do
  it_behaves_like "decorated_model"
end

答案 2 :(得分:1)

module Share
  def share
  end
end

describe "Share Test" do
   extend Share
end

您可以直接在测试中调用模块的方法

答案 3 :(得分:0)

其他答案使用模块的方法污染了测试,或者涉及编写虚拟类。该解决方案使用内置的double对象作为一次性对象来扩展模块的方法。

RSpec.describe Share do
  describe '#share' do
    subject { double.extend(described_class) }
  end

  it 'does something cool' do
    expect(subject.share).to eq 'something_cool'
  end
end