require "rake" require "spec/rake/spectask" desc "Run all examples" Spec::Rake::SpecTask.new("examples") do |t| t.spec_files = FileList["spec/*_spec.rb"] end desc "Run all examples with RCov" Spec::Rake::SpecTask.new("examples_with_rcov") do |t| t.spec_files = FileList["spec/*_spec.rb"] t.rcov = true t.rcov_opts = ["--exclude", "spec"] end이제 rake examples_with_rcov 라는 명령을 실행했을때 다음과 같은 멋있는 HTML 결과를 볼 수 있다.
describe "An interface" do it "should prompt for players" it "should prompt for grid size" it "should be able to update board display" it "should display a score board" do game = mock("game") players = %w[Greg Pete Paul] game.should_receive(:players).and_return(players) players.each do |p| game.should_receive(:score).with(p).and_return(0) end @interface.score_board(game).should == " Greg: 0 Pete: 0 Paul: 0" end it "should prompt for a players move" end여기서는 가짜 오브젝트를 이용해서 진짜 Dots::Game 오브젝트를 넘기지는 않지만, 이 예제만으로도 코드가 제대로 작동하는지를 파악하는데는 부족함이 없을 것이다.
$ spec spec/game_spec.rb -H Dots::Game#start ......... Finished in 0.027817 seconds 9 examples, 0 failures ********************************************************************** *** Dots::Game#start loaded with 2 possible mutations ********************************************************************** 2 mutations remaining... 1 mutations remaining... The following mutations didn"t cause test failures: def start @players = interface.get_players @turn = -8 @score = Hash.new(0) rows, cols = interface.get_grid_size @grid = Dots::Grid.new(rows, cols) interface.update_display(self) end Here"s the original code: def start @players = interface.get_players @turn = 0 @score = Hash.new(0) rows,cols = interface.get_grid_size @grid = Dots::Grid.new(rows,cols) interface.update_display(self) endHeckle을 통해서 알게 된 건 trun 변수가 0에서 시작해야 한다는 점을 우리가 명시해 주지 않고 있다는 것이다. 물론 지금 당장은 trun 변수가 0을 초기값으로 같지 않는다고 해도 게임이 작동하는데는 아무런 지장이 없다. 하지만 초기값이 0이 아니라는 사실이 필자에게는 조금은 놀랍게 느껴졌다. 간단한 스펙의 작성으로 이런 모호함을 해결할 수 있다.
describe "A newly started game" do # ... it "should start at turn 0" do @game.turn.should == 0 end # ... end이제 Game#start에 대해서 Heckle을 실행하면 결과는 "no mutants"라고 나오게 된다.
$ spec spec/game_spec.rb -H Dots::Game#start .......... Finished in 0.029037 seconds 10 examples, 0 failures ********************************************************************** *** Dots::Game#start loaded with 2 possible mutations ********************************************************************** 2 mutations remaining... 1 mutations remaining... No mutants survived. Cool!이런 Heckle과 같은 툴을 이용하는 것이 잠재적인 에러를 찾아내는데 도움이 된다고 생각은 하고 있지만, 필자 생각에는 이런 툴에 의지하고 스펙을 작성할때 집중해서 여러가지를 살펴보지 않는 것은 좋은 태도가 아니라고 생각한다. 물론 결과적으로 우리의 개발에 많은 도움이 될 것이다.
이전 글 : Behavior Driven Development Using Ruby (Part 3) - (2)
다음 글 : Behavior Driven Development Using Ruby (Part 3) - (4)
최신 콘텐츠