rspec共享示例与共享上下文

时间:2014-01-14 15:19:28

标签: ruby-on-rails ruby rspec

shared_examplesshared_context之间的真正区别是什么?

我的观察:

  1. 我可以使用两者(即使用shared_examplesshared_context)来测试相同的内容

  2. 但是如果我以后使用的话,我的其他一些测试会失败。

  3. 观察#1:

    我在shared_examples

    上的每篇文档中对shared_contexthttps://www.relishapp.com/进行了比较

    语法差异是:

    • shared_context用于定义将通过隐式匹配元数据在示例组的上下文中计算的块

    示例:

    shared_context "shared stuff", :a => :b do
      ...
    end
    
    • 从测试文件中包含或调用它们的方式

    shared_examples

    include_examples "name"      # include the examples in the current context
    it_behaves_like "name"       # include the examples in a nested context
    it_should_behave_like "name" # include the examples in a nested context
    

    shared_context

    include_context "shared stuff"
    

    观察#2

    我有一个测试用例

    shared_context 'limit_articles' do |factory_name|
      before do
        @account = create(:account)
      end
    
      it 'should restrict 3rd article' do
        create_list(factory_name, 3, account: @account)
    
        article4 = build(factory_name, account: @account)
        article4.should be_invalid
      end
    
      it 'should allow 1st article' do
        ...
      end
    
      it 'should allow 2nd article' do
        ...
      end
    end
    

    并将上下文包含在已包含一个shared_context的spec文件中,然后现有文件失败。但是我改变了顺序,然后我的所有测试通过

    失败

    include_context 'existing_shared_context'
    
    include_context 'limit_articles'
    

    此外,如果我将shared_context替换为shared_examples,并将其包含在测试用例中。

    通行证

    include_context 'existing_shared_context'
    
    it_behaves_like 'limit_articles'
    

4 个答案:

答案 0 :(得分:43)

shared_examples是以可以在多个设置中运行它们的方式编写的测试;提取对象之间的常见行为。

it_behaves_like "a correct object remover" do
    ...
end

shared_contexts是您可以用来准备测试用例的任何设置代码。这允许您包含测试助手方法或准备运行测试。

include_context "has many users to begin with"

答案 1 :(得分:16)

shared_examples包含一系列示例,您可以将这些示例包含在其他描述块中。

shared_context包含一组共享代码,您可以将其包含在测试文件中。把它想象成一个红宝石模块。

您可以在测试代码中使用shared_context,并将其与include_context方法一起使用。

另一方面,您声明某个事件behaves_like是共享示例组。

我想这是一个可读性的问题。

更新:

如果查看源代码,您会发现它们完全相同。查看此文件中的第35行:

https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/shared_example_group.rb

alias_method :shared_context,      :shared_examples

答案 2 :(得分:4)

非常琐碎和美观,但include_context没有输出"表现得像"在--format documentation

答案 3 :(得分:0)

这里是Rudy Jahchan写的一篇很棒的文章,它不仅展示了如何使用shared_contextshared_example,还展示了为什么他们'很有价值。
它是通过获取规范然后重构(DRYing)来使用shared_exampleshared_context来实现的。

BDD Composition over Inheritance with RSpec Shared Examples