2017-02-08 1 views
2

약 2 주 전 Ruby를 배우기 시작했습니다. 'open-uri'및 'nokogiri'를 사용하여 WebParser/Page WordCounter를 만들었습니다. 그래서 나는 'ruby counter.rb http://test.com word'와 함께 터미널을 실행하고 그 단어의 대소 문자를 구별하여 대소 문자를 구별하므로 모든 것을 포착 할 수 있습니다.RSpec을 사용하여 TDD/BDD에 대한 도움말 작성

여기 RSpec, TDD, BDD 및이 모든 것들에 대해 배우고 있으며, RSpec 예제와 기대를 사용하여 코드가 어떻게 구성되는지 알고 싶습니다. 필자는 이미 모든 문서를 읽고, 테스트 할 simples 예제를 만들고있다.

RSpec 예제와 기대에 내 코드를 작성할 수있는 사람이 있는지 알고 싶습니다. 완료하고 어떻게했는지.

여기 내 코드입니다 :

require 'open-uri' 
require 'nokogiri' 

class Counter 

    def initialize(url) 
     @url = url 
    end 

    def count(word, url) 
     doc = Nokogiri::HTML(open(url)) 
     doc.css('head').remove 
     doc.text.scan(/#{word}/i).size 
    end 
end 

url, word = ARGV 
puts "Found: #{Counter.new(url).count(word, url)} matches." 

희망 누군가가 나를 도울 수, 난 루비로 정말이야, 나는 공부하고 기다리고있을거야이 RSpec에 놀라운

고마워 발견!

+0

http://www.relishapp.com/rspec/rspec-core/v/3-5/docs를 확인하시기 바랍니다. 사용하기 쉬운 예제가 많이 있습니다 ... – orde

답변

3

상용구를 생성하는 명령어는 rspec --init입니다.

이 작업을 완료하면 spec_helper.rb을 열고 코드 파일이 필요합니다.

그런데 초기화가 URL을 받아 인스턴스 변수에 할당하는 것은 약간 이상하지만 count 메소드는 url을 인수로 사용합니다.

describe "Counter" do 
    let(:url) { "http://some_url" } 
    let(:counter) { Counter.new url } 
    it "counts words" do 
    expect(counter.count("foo")).to(
     eq("<whatever the expected result is>") 
    ) 
    end 
end 

let 사용 :

attr_reader :url 
def initialize(url) 
    @url = url 
end 

def count(word) 
    doc = Nokogiri::HTML(open(url)) # this uses the attr_reader 
    doc.css('head').remove 
    doc.text.scan(/#{word}/i).size 
end 

은 그럼 당신은 (이것은 광범위한 정보에 따르면, 단지 예가 아니다)이 같은 테스트 케이스를 작성할 수 있습니다

은 그래서 이것에 리팩토링있어 가정 변수 설정은 선택 사항입니다. it ... do 블록 내부의 변수를 설정할 수도 있지만 각각의 경우에 대해 반복해야합니다.

.to 외에도 .not_to이 있으며 eq 이외에도 유용한 방법이 많이 있습니다. RSpec matcher 문서를 읽는 것이 좋습니다.

이 테스트 사례가 때로는 필요로하는 HTTP 호출을 작성하고 때로는 그렇지 않을 수도 있음을 언급 할 필요가 있습니다. 예를 들어 많은 경우에 신속하게 실행하고 싶다면 HTTP 호출을 제거하는 것이 좋습니다. 그러나 이렇게하면 더 이상 실제로 URL의 상태를 테스트하지 않습니다. 마크 업이 변경되면 어떻게됩니까? 테스트 케이스가 실제로 HTTP 호출을 작성하지 않는 한, 당신은 확실하게 알 수 없습니다.

여전히 기본 개념 ("조롱"또는 "스텁")은 많은 용도가 있으므로 HTTP 호출을 제거하는 방법을 알고있는 것이 좋습니다. 이런 식으로 뭔가 :

it "counts words" do 
    mock_html = <<-HTML 
     <!doctype html> 
     <html lang='en'> 
     <head></head> 
     <body>foo</body> 
     </html> 
    HTML 
    expect(Object).to(
     receive(:open).with(any_args).at_least(1).times.and_return(mock_html) 
    ) 
    expect(counter.count("foo")).to eq(1) 
    expect(counter.count("bar")).to eq(0) 
    end 

any_args는 방법을 스텁 때 사용할 수있는 특수 용어이다. 전달 된 인수가 무엇인지 알기 때문에 여기에서 url을 사용할 수도 있습니다.

자세한 내용은 RSpec의 문서를 참조하십시오. 이번에는 조롱/스터 빙에 관한 내용을 참조하십시오.

일반적으로 대부분 함수의 입력/출력에 집중하려고합니다. 때로는 다른 메소드가 호출되었는지 확인하고 싶을 것이다. (이것에 mock/stub을 사용한다.)하지만 코드의 모든 단일 라인을 테스트 할 필요는 없을 것이다.

+0

'rspec init' 또는'rspec --init'? –

+0

와우, 그건 정말 도움이되었습니다. 도움을 많이 주셔서 감사합니다. 그리고 페이지에서 소스 코드를 다운로드하면 HTTP 요청을하지 않아도 다운로드 한 file.html을 읽고 싶습니다. 어떻게해야합니까? 파일 경로를 변수에 넣으시겠습니까? – MoscrowDev

관련 문제