2017-12-05 15 views
0

TL; DR 내년에 부트 캠프에 갈 예정이며 평가는 루비를 배우는 중입니다. 나는 JS에 배경이 있고 루비에 대해 아주 새로운 사람이다. 나는이 평가를 받았는데 나는 그 시험이 내가 무엇을하기를 바라는 지 잘 모른다. 아래는 테스트 케이스 (Rspec)이며 그 바로 아래가 내 답변입니다.정확하게 묻는 Rspec 구문은 무엇입니까?

describe "some silly block functions" do 
    describe "reverser" do 
    it "reverses the string returned by the default block" do 
     result = reverser do 
     "hello" 
     end 

    expect(result).to eq("olleh") 
end 

it "reverses each word in the string returned by the default block" do 
    result = reverser do 
    "hello dolly" 
    end 

    expect(result).to eq("olleh yllod") 
    end 
end 

이 내 대답 코드입니다 : 내가 언급 한 바와 같이 나는 루비에 새로운 오전과 항복의 아이디어가 JS에 대한 콜백 함수처럼 위

def reverser sentence 
    words = sentence.split(" ") 
    result = [] 

    words.length.times do |i| 
    result.push(yield(words[i])) 
    end 

    result.join(" ") 
end 

reverser("hello dolly") {|n| n.reverse} #=> 'olleh yllod' 

. 테스트 케이스에서 내가 쓰고 싶어하는 코드가 무엇인지 알기가 힘듭니다. '기본 블록에서 반환 된 문자열에서 각 단어를 뒤집습니다'라는 말은 방금 단어가 반전되는 함수 외부에서 블록을 작성한 것입니다. 누구에게 조언을 줄 수 있는지에 대한 도움과 안내에 감사드립니다.

답변

5

이것은 Ruby보다 TDD에 관한 것입니다. 이 접근법은 다른 언어에서도 마찬가지입니다.

TDD의 핵심은 오류가 발생할 수있는 가장 단순한 테스트를 작성한 다음 오류 메시지를 변경할 수있는 가장 간단한 코드를 작성하는 것입니다. 이 예에서는 1 단계가 이미 제공되어 있으므로 실제로는 # 2 단계입니다. 메시지를 변경할 수있는 가장 간단한 코드를 작성하십시오.

테스트를 실행 해 봅시다! 이 메시지는 말한다 :

가능하게하는 방법이 존재하지 않습니다라는 메시지를 변경할 수있는 간단한 코드를 무엇
NoMethodError: 
    undefined method `reverser' … 

? 음, 물론 존재하는 방법을 만들어라!

expected: "olleh" 
    got: nil 

좋아, 그래서 문자열 'olleh'를 돌려 우리를 예상하지만, 우리는 실제로 nil을 반환

def reverser; end 

이제 메시지입니다. 간단합니다 :

def reverser; 'olleh' end 

위대한! 첫 번째 테스트가 통과됩니다. 그러나 두 번째는 여전히 실패합니다. 그것은 :

expected: "olleh yllod" 
    got: "olleh" 

음 ... 분명히, 그냥 정적으로 뭔가를 반환 충분하지 않습니다. 우리는 매번 다른 것을 되돌려 보내야합니다. 확실한 소스는 인수이지만 메소드에는 매개 변수가 없습니다. 아니면 그렇습니까? 예! Ruby에서 모든 메서드는 암시 적 블록 매개 변수를가집니다! 당신은 yield 키워드를 사용하여 평가하고, 그래서 그것을 시도 할 수 있습니다

def reverser; yield end 

젠장! 우리는 두 가지 오류로 돌아 왔습니다! 그건 한 걸음 뒤로 물러났다. 아니면 그랬어? 첫 번째 오류 메시지를 살펴 보겠습니다.

expected: "olleh" 
    got: "hello" 

알아 차리셨습니까? 기대 값은 우리가 현재 반환하고있는 값의 역순입니다. 따라서 반환 값을 반대로 바꾸면됩니다.

def reverser; yield.reverse end 

만세! 1 오류로 다시 돌아 왔습니다.

expected: "olleh yllod" 
    got: "yllod olleh" 

또 무슨 일이 일어나고 있는지 확인할 수 있습니까? 단어의 순서가 바뀐 것입니다! 단어를 분리하고 뒤집어서 다시 묶어야합니다.

def reverser; yield.reverse.split.reverse.join end 

너무 가깝습니다.

expected: "olleh yllod" 
    got: "ollehyllod" 
우리는 단지 다시 공간을 둘 필요가

:

def reverser; yield.reverse.split.reverse.join(' ') end 

Yippieh!

2 examples, 0 failures 

중요한 것은입니다 : 생각에 어떤 시점에서 우리가 실제로 있었나요. 모든 단계에서 테스트은 무엇을해야할지, 다음에 무엇을해야하는지, 언제 완료되었는지를 알려줍니다. 그것이 TDD가하는 것입니다. 테스트 드라이브 개발.

+0

그게 정말 흥미로운 해결책입니다! 테스트 케이스의 입력 인'result = reserver { "hello dolly"} "에 대해서는 전혀 생각해 보지 못했습니다. 철저한 설명 주셔서 감사합니다! – Ken

0

yield은 "블록 내부에서 코드를 실행하고 결과를 제공"을 의미합니다.

def reverser 
    yield.split.map(&:reverse).join(' ') if block_given? 
end 

result = reverser do 
    'hello world' 
end 

puts result 
# => olleh dlrow 

루비가 자동으로 반환 값으로 불리는 마지막 일을 반환, 그래서 reverser에 주어진 블록의 반환 값은 yield에 할당 될 것 인 hello world입니다 : 귀하의 reverser 메소드는 다음과 같이 쓸 수 있습니다.

block_given?here에 대한 설명서를 확인할 수 있습니다. 블록에 대한 더 깊은 설명을 위해 this answer을보십시오.

+0

'split'은 기능상 split ('')'과 같습니다. – moveson

0

부트 캠프를 사용하는 경우 RSpec 및 TDD에 대해 설명하는 것이 중요하다고 생각합니다. 문제에 대한 답을주는 것이이 경우에 알아야 할 부분 일뿐입니다. 그래서 ...

TDD의 원칙 중 하나는 테스트를 통과하기 위해 최소한의 코드를 작성하는 것입니다. 내가 처음으로 돌아 가면.

def reverser sentence 
    'olleh' 
end 

테스트를 실행하고 테스트가 오류와 함께 실패한다 : wrong number of arguments

당신은 인수로 sentence 소요 reverser 방법을 작성했습니다. 인수를 제거하고 그 시도하고 다시 RSpec에 실행 :

def reverser 
    'olleh' 
end 

첫 번째 테스트를 통과해야하지만, 우리는 하드 olleh의 반환 값을 코딩 한대로 두 번째 테스트를 실패합니다. 분명히 하드 코딩 된 값을 반환하는 것은 좋지 않습니다. 테스트를 통과하는 데 도움이되었습니다. 따라서 yield 반환 값을 계산해야합니다.

def reverser 
    yield.reverse 
end 

그리고 이것은 아마도 두 번째 테스트 통과를 얻을 것이다 ...

이 TDD의 원칙이다, 작은 조치를 취할와 코드가 통과 할 수. 일단 통과하면 다시 돌아가서 리팩토링하고 코드를 개선하십시오.

이미 알고 계시 겠지만 TDD는 좋은 품질의 코드를 작성하는 데 매우 귀중합니다. 코드를 재미있게 작성하고 리팩토링에 도움이됩니다.

는 좀 resources있는 페이지를 발견하고 나는 codeschool를 추천 할 것입니다하지만 그들은 유감 그들의 과정을 은퇴했지만 도움이 될 수있는 PluralSight TDD course이 있고 또한 당신을 제공 너무 유용 할 수있는 Udemy course on TDD이 머리를 시작합니다.