在我的应用中,当用户分享他评分增长的内容时。当他试图分享两次 - 他将不会获得第二次尝试的额外评级。对于应用程序,共享回调是由客户端用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
代码就是在这里编写的,我只想尝试一下。
答案 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