Rspec-core: ๋ถ„๋ฆฌ๋œ ๊ณต์œ  ๊ทธ๋ฃน์—์„œ ๋‹จ์ผ ์‚ฌ์–‘์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2010๋…„ 07์›” 20์ผ  ยท  10์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rspec/rspec-core

๋‹ค์Œ์€ ๊ณต์œ  ์‚ฌ์–‘ ๊ทธ๋ฃน์„ ์‚ฌ์šฉํ•˜๋Š” ์ „์ฒด ์‚ฌ์–‘ ์ œํ’ˆ๊ตฐ์„ ์‹คํ–‰ํ•˜์—ฌ ์–ป์€ ์—ญ์ถ”์ ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

8)
RuntimeError in 'Arel Join#each iterates over the rows in any order'

/Users/apatterson/git/arel/spec/../lib/arel/algebra/relations/operations/join.rb:14:in `hash'
/Users/apatterson/git/arel/spec/../lib/arel/session.rb:38:in `[]'
/Users/apatterson/git/arel/spec/../lib/arel/session.rb:38:in `read'
/Users/apatterson/git/arel/spec/../lib/arel/algebra/relations/relation.rb:21:in `each'
/Users/apatterson/git/arel/spec/support/matchers/have_rows.rb:5:in `have_rows'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/matchers/simple_matcher.rb:16:in `call'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/matchers/simple_matcher.rb:16:in `matches?'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/expectations/handler.rb:11:in `handle_matcher'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/expectations/extensions/kernel.rb:27:in `should'
/Users/apatterson/git/arel/spec/shared/relation_spec.rb:23:
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_methods.rb:40:in `instance_eval'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_methods.rb:40:in `execute'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/timeout.rb:53:in `timeout'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_methods.rb:37:in `execute'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_methods.rb:214:in `run_examples'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_methods.rb:212:in `each'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_methods.rb:212:in `run_examples'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_methods.rb:103:in `run'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/example_group_runner.rb:23:in `run'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/example_group_runner.rb:22:in `each'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/example_group_runner.rb:22:in `run'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/options.rb:152:in `run_examples'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/command_line.rb:9:in `run'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/bin/spec:5

์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

1) ์—ญ์ถ”์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๊ณต์œ  ์‚ฌ์–‘์˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ „ํ˜€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์ผ๋ช… ์–ด๋””์— ํฌํ•จ๋˜์—ˆ๋Š”์ง€, ์–ด๋–ค ํŒŒ์ผ์— ํฌํ•จ๋˜์—ˆ๋Š”์ง€ ๋“ฑ... 'Arel Join#each๋Š” ์ž„์˜์˜ ์ˆœ์„œ๋กœ ํ–‰์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค'๋ผ๋Š” ์„ค๋ช…์ด ์žˆ์ง€๋งŒ ์‚ฌ์–‘์ด ๋งŽ์€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜.

2) ํ•ด๋‹น ๋‹จ์ผ ์‚ฌ์–‘์„ ์‹คํŒจํ•˜๊ฒŒ ๋งŒ๋“  ์ปจํ…์ŠคํŠธ์—์„œ ๊ฒฉ๋ฆฌํ•˜์—ฌ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

rspec spec/my_spec_that_contains_the_shared_group.rb --example "hello world" ๋ฅผ ํ†ตํ•ด ๊ณต์œ  ๊ทธ๋ฃน์—์„œ ๋‹จ์ผ ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  10 ๋Œ“๊ธ€

David, ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

"it_should_behave_like"(๋˜๋Š” ๋ณ„์นญ)๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ExampleGroup์—์„œ ๋‹ค์Œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ณต์œ  ์˜ˆ์ œ ๊ทธ๋ฃน์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
"it_should_behave_like" ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์˜ ํŒŒ์ผ ๊ฒฝ๋กœ ๋ฐ ์ค„ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.

์˜ˆ์ œ๊ฐ€ ์‹คํŒจํ•˜๋ฉด RSpec์€ ํ•ด๋‹น ์˜ˆ์ œ๊ฐ€ ๊ณต์œ  ์˜ˆ์ œ ๊ทธ๋ฃน์— ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ํŒŒ์ผ ๊ฒฝ๋กœ์™€ ์ค„ ๋ฒˆํ˜ธ(ExampleGroup ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ์ €์žฅ๋จ)๊ฐ€ ์ถœ๋ ฅ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด?

์˜ค ์ข‹๋„ค์š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค :-)

๊ณต์œ  ๊ทธ๋ฃน์„ ํ˜ธ์ถœํ•˜๋Š” ํ–‰์„ ํ‘œ์‹œํ•˜๋Š” @justinko์˜ ํŒจ์น˜(3906559d059bcdbd4d15303303c517088b038eeb)๋ฅผ ๋ณ‘ํ•ฉ ํ–ˆ์œผ๋ฏ€๋กœ ์ด์ œ ์‹คํ–‰๋œ ์ปจํ…์ŠคํŠธ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ผ ๊ณต์œ  ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์—ฌ์ „ํžˆ ์—ด์–ด ๋‘ก๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ๊ณต์œ  ์˜ˆ์ œ๊ฐ€ ์‹คํŒจํ•  ๋•Œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ์ตœ์†Œํ•œ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

rspec spec/my_spec_that_contains_the_shared_group.rb --example "hello world" ๋ฅผ ํ†ตํ•ด ๊ณต์œ  ๊ทธ๋ฃน์—์„œ ๋‹จ์ผ ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ - ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‹ซ์„ ๊ฒƒ์ด๋‹ค. @carllerche ์ด๊ฒƒ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ์—ฌ๊ธฐ์— ๋Œ“๊ธ€์„

์  ์žฅ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฒ„๊ทธ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

share_as :MySpecs do
  let(:foo) { described_class # returns nil }

์กฐ์‚ฌ ์ค‘.

share_as๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. include ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌํ•จํ•˜๋Š” ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ด์ œ shared_examples_for ์—์„œ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ค‘์ฒฉ ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋งค์šฐ ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

๋น„์ถ”์ฒœ์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ RSpec์„ ๋ฐฐ์šฐ๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ shared_examples_for ์™€ share_as ๊ฐ€ ์™œ ์žˆ๋Š”์ง€ ํ˜ผ๋ž€์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ตœ์ƒ์œ„ ๊ทธ๋ฃน์— share_as ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

describe Model do
  include MySharedSpecs

  context 'it works' do
    it_should_behave_like 'a working model'

shared_examples_for ๋กœ ์ „ํ™˜ํ–ˆ๋Š”๋ฐ ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

๋งจ ์•„๋ž˜๋กœ ๊ฑด๋„ˆ๋›ฐ๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์ €๋Š” justinko๊ฐ€ ์œ„์—์„œ ์ด์— ๋Œ€ํ•ด ์™„์ „ํžˆ ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๋‹ต๋ณ€์„ ์ œ๊ณตํ–ˆ๋‹ค๋Š” ์ ์„ ์ง€์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

rspec spec/my_spec_that_contains_the_shared_group.rb --example "hello world"๋ฅผ ํ†ตํ•ด ๊ณต์œ  ๊ทธ๋ฃน์—์„œ ๋‹จ์ผ ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰