string_spec.rb describe "String indexing" do it "should return first character for position 0" do "foo"[0].should == "f" end end척 보니 어디가 틀렸는지 알 수 있겠는데, 루비 초보자라면 아마 다음 실행결과를 보고 놀랐을 것이다.
$ spec string_spec.rb F 1) "String indexing should return first character for position 0" FAILED expected "f", got 102 (using ==) ./string_spec.rb:4: Finished in 0.00995 seconds 1 example, 1 failure루비 스트링에서 인덱싱을 이용해서 한 글자를 받아온 결과는 한개의 글자를 가진 스트링이 아니고, 해당 문자에 대한 ASCII 정수 값이라는 것이다. 우선 이 문제를 해결하기 위해서 스펙에 이 상황을 기록해야 겠지만, 우선 RSpec을 처음보는 독자를 위해서 조금 설명을 하고 가도록 하겠다.
describe "String indexing" do # ... end구문은 단순히 여러 예제들을 포함하기 쉽도록 도와주는 개념이라고 볼 수 있다. 여기서는 구문이 하나의 예제를 포함하고 있는 걸 알 수 있다.
it "should return first character for position 0" do "foo"[0].should "f" end이제 위에서 만들었던 스펙을 수정해서 정상적으로 작동하도록 수정하고, 공통 설정을 추가해서 다른 인덱싱 관련 예제들을 작성하는데 사용할 수 있도록 하겠다.
describe "String indexing" do before :each do @string = "foo" end it "should return first character"s ASCII value for position 0" do @string[0].should == ?f end end위에서 보듯이 문제에 대한 ASCII 정수 값과 기대하는 값이 제대로 일치하는지를 확인하도록 수정했다.
describe "String indexing" do before :each do @string = "foo" end it "should return first character"s ASCII value for position 0" do @string[0].should == ?f end it "should return the last character"s ASCII value for position -1" do @string[-1].should == ?o end it "should return the first two characters for the range 0..1" do @string[0..1].should == "fo" end it "should return the last two characters for the range -2..-1" do @string[-2..-1].should == "oo" end it "should replace the second character with a new substring" do @string[1] = "id" @string.should == "fido" end it "should become empty when 0..-1 is set to empty string" do @string[0..-1] = "" @string.should be_empty end end보면 알겠지만, 일부 예제에서는 @string의 값을 수정하고 있다. 하지만 사전에 설정했던 훅에서 매번 @string의 값을 초기화 해주고 있기 때문에, 다음 예제에서 사용할 때 문제가 발생하지 않는다는 것을 알 수 있다.
@string.should be_empty정확하게 어떻게 동작하는 것인지 알기 위해서 한 번 헬퍼를 조금 수정 한후에 에러 메시지를 보도록 하겠다.
@string.should be_incredible다음과 같이 에러가 발생한다.
NoMethodError in "String indexing should become empty when 0..-1 is set to empty string" undefined method "incredible?" for "":String에러를 보면 be_something이라는 헬퍼를 사용했을 경우 어떤 식으로 동작이 일어나는지를 추측해 볼 수 있다. RSpec은 입력으로 받은 오브젝트에서 something이라는 함수를 찾은 후에 그 함수를 실행해서 true를 리턴하는지 확인하는 과정을 수행한다.
it "should become empty when 0..-1 is set to empty string" do @string[0..-1] = "" @string.should_not be_empty end "String indexing should become empty when 0..-1 is set to empty string" FAILED expected empty? to return false, got true ./string_spec.rb:30: Finished in 0.01074 seconds 6 examples, 1 failure모든 걸 확인했으니 다시 원상태로 되돌려 놓겠다. 이렇게 부정문의 형태를 취하는 방법은 여러분이 작성한 스펙이 정상적으로 작동하는지 확인해 보기 위한 방법으로 사용될 수도 있다. 필자의 경우 보통 스펙을 작성하기 시작할때 부터 고의적으로 오류가 발생하도록 해서 정확하게 작동하는지를 확인해 보기도 한다. 사실 이런 테스트를 위한 방법이 RSpec에 존재한다. violated 라는 함수를 이용할 수 있다.
it "should fail no matter what" do violated "The Interstellar Rules Of The Galaxy" end물론 모든 예제를 작성할때 마다 이런 실패 테스트를 할 필요는 없겠지만, 이런 과정을 거쳐가게 되면 나중에 개발하면서 큰 도움이 될 수가 있다.
이전 글 : 리눅스 오디오 소개
최신 콘텐츠