How can I test ActionCable channels using RSpec?

后端 未结 4 1495
刺人心
刺人心 2021-01-01 19:25

I am wondering how to test ActionCable channels.

Let\'s say I have the following chat channel:

class ChatChannel < ApplicationCable::Channel
  def s         


        
相关标签:
4条回答
  • 2021-01-01 19:41

    You can use `action-cable-testing` gem.

    Add this to your Gemfile
    gem 'action-cable-testing'
    Then run
    $ bundle install

    Then add following spec

    # 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
    

    For more information see readme in github repo.

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

    There are examples for both rspec and test_case

    0 讨论(0)
  • 2021-01-01 19:47

    Now Rails 6 includes the action-cable-test gem

    So there is no need to add a gem. You can do either

    assert_has_stream "chat_1"
    

    or, with rspec:

    expect(subscription).to have_stream_from("chat_1") 
    
    0 讨论(0)
  • 2021-01-01 19:53

    You probably want to wait* for https://github.com/rails/rails/pull/23211 to be merged. It adds ActionCable::TestCase. Once that's merged, expect the rspec-rails team to do its part: https://github.com/rspec/rspec-rails/issues/1606

    * Waiting is optional; You can not wait and based your own work on this "work in progress" and find a solution that works right now.

    0 讨论(0)
  • 2021-01-01 20:02

    I would install and configure TCR gem for recording sockets interaction ('its like VCR for websockets')

    A spec for this in your case might look something like this...

    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
    
    0 讨论(0)
提交回复
热议问题