0

Rails アプリケーションに OpenTok を統合するために使用している gem は、https ://github.com/opentok/Opentok-Ruby-SDK にあります。アプリケーションのコアは、次の例に基づいています: http://www.tokbox.com/blog/building-a-video-party-app-with-ruby-on-rails .

コードの関連部分では、config_opentok メソッドで @opentok オブジェクトを作成しています。

    def config_opentok
        if @api_key.nil? or @api_secret.nil?
            if Rails.env.development?
                @api_key = API_KEY
                @api_secret = API_SECRET
            else
                @api_key = ENV['API_KEY']
                @api_secret = ENV['API_SECRET']
            end
        end
        if @opentok.nil?
            @opentok = OpenTok::OpenTokSDK.new(@api_key, @api_secret)
        end
    end

そして、次のコードでセッションを作成しています:

    config_opentok

    if Rails.env.development?
        session = @opentok.create_session('localhost')
    else
        session = @opentok.create_session(request.remote_addr)
    end

問題は、create_session がエラーをスローするように見えることです。

SocketError: getaddrinfo: nodename nor servname provided, or not known

インターネットに接続せずに Rspec テストを実行するたびに。そのため、ハッシュ {:sessionId => 1} だけを返すようにそのメソッドをスタブしたいと思います。しかし、メソッドをスタブする方法を理解するのに苦労しています。OpenTok モジュールまたは OpenTok::OpenTokSDK クラスを単にスタブすることはできません。create_session メソッドをスタブ化するにはどうすればよいですか?

4

2 に答える 2

0

これが私が行ってきたことです。

まず、アプリの読み込み時に OpenTok オブジェクトを初期化する傾向があるため、リクエストごとに OpenTok オブジェクトを作成することはありません。これを行うには、config/initializers フォルダーに ruby​​ ファイル (apis.rb) を作成します。

私の apis.rb は次のようになります。

TB_KEY = ENV['TB_KEY']
TB_SECRET = ENV['TB_SECRET']
OTSDK = OpenTok::OpenTokSDK.new TB_KEY, TB_SECRET

私のコントローラーでは、セッションを生成するために、OTSDK.createSession既に持っているものと同様に、 を呼び出すだけです。

rspec でテストするには、テスト ファイルに次のように記述します。

OTSDK.stub(:createSession).and_return( {:sessionId => "1MX_2A3453095J0TJ30..."} )

wifi をオフにして rspec を実行すると、createSession を呼び出してもエラーが発生しなくなります。

rspec スタブのドキュメントは次のとおりです: http://rubydoc.info/gems/rspec-mocks/frames

幸運を!

于 2013-02-14T21:00:25.157 に答える
0

問題は、インターネット接続なしで Rspec テストを実行するたびに、create_session がエラーをスローするように見えることです。

スタブを試行する代わりに、テストにVCRを使用した模擬インターネット接続を提供してみませんか?

初期設定後、VCR を使用すると、インターネットにアクティブに接続しているかのようにすべてのテストを実行できます。これにより、テストをオフラインで実行し、アクティブな接続を必要とするすべてのテストを高速化し、一貫した結果セットを得ることができます。

RailsCastsを購読している場合は、Ryan がエピソード 291で VCR に関するビデオを作成しました。

于 2013-02-14T21:25:08.177 に答える