4

私はモデルのテストを書きました:

describe Video do
  describe 'searching youtube for video existence' do
    it 'should return true if video exists' do
      Video.video_exists?("http://www.youtube.com/watch?v=KgfdlZuVz7I").should be_true
    end
  end  
end

モデルコードは次のとおりです。

class Video < ActiveRecord::Base
  attr_accessible :video_id

  def self.video_exists?(video_url)
    video_url =~ /\?v=(.*?)&/
    xmlfeed = Nokogiri::HTML(open("http://gdata.youtube.com/feeds/api/videos?q=#{$1}"))
    if xmlfeed.at_xpath("//openSearch:totalResults").content.to_i == 0
      return false
    else
      return true
    end
  end
end

しかし、それはエラーで失敗します:

Failures:

  1) Video searching youtube for video existence should return true if video exists
     Failure/Error: Video.video_exists?("http://www.youtube.com/watch?v=KgfdlZuVz7I").should be_true
     NameError:
       uninitialized constant Video::Nokogiri
     # ./app/models/video.rb:6:in `video_exists?'
     # ./spec/models/video_spec.rb:6:in `block (3 levels) in <top (required)>'

Finished in 0.00386 seconds
1 example, 1 failure

これを解決する方法がわかりません、何が問題になる可能性がありますか?

4

2 に答える 2

10

gem nokogiri問題は、 Gemfileに追加しなかったためです。

追加した後、モデルから削除require 'nokogiri'して動作します。require 'open-uri'

于 2012-09-18T02:32:36.340 に答える
3

のこぎりは必要ないようですので、必要です。

uninitialized constant Video::Nokogiri

プレゼントです。Rubyは「のこぎり」が定数であることを知っていますが、どこにあるのかわかりません。

コードでは、NokogiriはOpen-URIに依存してコンテンツを取得するため、コンテンツも取得する必要がrequire 'open-uri'あります。Nokogiriは、Open-URIがopen返すファイルハンドルを読み取ります。

このセクションは、より簡潔に書くことができます。

if xmlfeed.at_xpath("//openSearch:totalResults").content.to_i == 0
  return false
else
  return true
end

なので:

!(xmlfeed.at_xpath("//openSearch:totalResults").content.to_i == 0)

また:

!(xmlfeed.at("//openSearch:totalResults").content.to_i == 0)
于 2012-09-17T16:41:27.517 に答える