shared_examples
和shared_context
之间的真正区别是什么?
我的观察:
我可以使用两者(即使用shared_examples
或shared_context
)来测试相同的内容
但是如果我以后使用的话,我的其他一些测试会失败。
观察#1:
上的每篇文档中对shared_context和https://www.relishapp.com/进行了比较语法差异是:
示例:
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'
答案 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_context
和shared_example
,还展示了为什么他们'很有价值。
它是通过获取规范然后重构(DRYing)来使用shared_example
和shared_context
来实现的。