15

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データベースを更新し、チャネル全体にブロードキャストされる 2 つのストリームを定義しますが、私の質問はより一般的なものであるため、詳細はあまり重要ではありません。

  • このチャネルをサブスクライブすることによって、関連するロジックをテストするテストをセットアップするにはどうすればよいですか?

RSpec は、コントローラー アクションなどの同様の相互作用をテストするときに、多くのヘルパー メソッドとさまざまなユーティリティを提供しますが、RSpec と ActionCable に関するものは見つかりませんでした。

4

4 に答える 4

3

ソケットの相互作用を記録するためにTCR gemをインストールして構成します(「WebソケットのVCRに似ています」)

あなたの場合の仕様は次のようになります...

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
于 2016-02-05T16:56:45.873 に答える
2

Rails 6 にはaction-cable-test gemが含まれるようになりました

したがって、gem を追加する必要はありません。あなたはどちらかを行うことができます

assert_has_stream "chat_1"

または、rspec を使用:

expect(subscription).to have_stream_from("chat_1") 
于 2020-12-11T14:35:15.380 に答える