2016-02-05 13 views
14

私はActionCableチャネルのテストについて疑問に思っています。RSpecを使用してActionCableチャンネルをテストするにはどうすればよいですか?

のは、私は次のチャットチャンネルを持っているとしましょう:

class ChatChannel < ApplicationCable::Channel 
    def subscribed 
    current_user.increment!(:num_of_chats) 

    stream_from "chat_#{params[:chat_id]}" 
    stream_from "chat_stats_#{params[:chat_id]}" 
    end 
end 

subscribed方法は、DBを更新し、チャネルを介して放送される2つのストリームを定義していますが、私の質問が多いので、詳細は非常に重要ではありません一般的なもの:

  • このチャンネルを購読することで、ロジックをテストするテストを設定するにはどうすればよいですか?

RSpecは、コントローラアクションのような同様のやりとりをテストするときに、多くのヘルパーメソッドとさまざまなユーティリティを提供しますが、私はRSpecとActionCableに関する何かを見つけることができます。あなたのケースでは、私が記録ソケットの相互作用(「WebSocketをのためにそのようなVCR」)のためTCR gemをインストールして構成します

答えて

7

ますおそらくhttps://github.com/rails/rails/pull/23211がマージされるのを待っています。それはActionCable :: TestCaseを追加します。それがマージされています後は、RSpecのレールにその一部を行うためにチームを期待:https://github.com/rspec/rspec-rails/issues/1606

*待機はオプションです。あなたはこの "作業中の作業"についてあなた自身の作業を待つことはできませんし、今すぐ使える解決策を見つけることもできません。

3

このため仕様は次のようになります...

describe ChatChannel do 
    context ".subscribed" do 
    it "updates db and defines opens 2 streams for one channel" do 
     TCR.use_cassette("subscribed_action") do |cassette| 
     # ... 
     ChatChannel.subscribed 
     expect(cassette).to include "something ..." 
     end 
    end 
    end 
end 
+2

をtest_caseは理にかなっています外部HTTP要求をスタブしたい場合(コントローラのアクションが外部呼び出しを発行する場合など)、ここではそうではありません。ここでは、自分の内部メソッドを呼び出すだけです。しかしもう一度 - 良いアイデアだと私はそれを行ってみましょう。 – Dani

+0

ちょっとダニ、解決策を見つけましたか?もしそうなら、私がチェックアウトできるレポを指摘できますか? –

1

`action-cable-testing` gemを使用できます。

詳細については
$ bundle install

次に、以下の仕様を追加

# spec/channels/chat_channel_spec.rb

require "rails_helper" 

RSpec.describe ChatChannel, type: :channel do 
    before do 
    # initialize connection with identifiers 
    stub_connection current_user: current_user 
    end 

    it "rejects when no room id" do 
    subscribe 
    expect(subscription).to be_rejected 
    end 

    it "subscribes to a stream when room id is provided" do 
    subscribe(chat_id: 42) 

    expect(subscription).to be_confirmed 
    expect(streams).to include("chat_42") 
    expect(streams).to include("chat_stats_42") 
    end 
end 

を実行する次に、あなたのGemfileに
gem 'action-cable-testing'
をこの追加はgithubのレポでreadmeファイルを参照してください。ときVCR(と同様にTCR)を使用して

https://github.com/palkan/action-cable-testing

あり、両方のRSpecのための一例であり、非常に良いアイデア、ありがとう、しかしだ(と私が間違っているなら、私を修正)その

+1

このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューから](レビュー/低品質の投稿/ 18680949) –

+1

@MaximilianPeters私はそれが今より読みやすいと思います。 – zhisme

関連する問題