2017-02-08 4 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を引数として取ります。

だから、これにリファクタリングだと仮定すると:

​​

次に、あなたはこのようなテストケース(これは、単なる一例包括的にカバーではありません)書くことができます。letへの使用

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 

を変数の設定はオプションです。 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のドキュメントを参照してください。今度は、模擬/スタブに関するものです。

一般的には、ほとんどの場合、関数の入出力に集中する必要があります。場合によっては、別のメソッドが呼び出されているかどうかをチェックしたいかもしれませんが(モック/スタブを使用します)、コードのすべての行をテストする必要はありません。

+0

'rspec init'または' rspec --init'? –

+0

うわー、それは本当に役に立ちました。助けてくれてありがとう。 そして、もし私がページからソースコードをダウンロードすると、HTTPリクエストをする必要はありません。ダウンロードしたfile.htmlを読みたいのですが、どうすればいいですか?ファイルパスを変数に入れますか? – MoscrowDev

関連する問題