2016-02-05 5 views
14

Мне интересно, как тестировать каналы ActionCable.Как проверить каналы ActionCable с помощью RSpec?

Допустим, у меня есть следующий канал чата:

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 обновляет БД и определяет два потока, которые будут транслироваться по каналу, но детали не очень важны, так как мой вопрос более общий:

  • Как настроить тест для проверки логики, связанной с подпиской на этот канал?

RSpec предоставляет множество вспомогательных методов и различных утилит при тестировании подобных взаимодействий, таких как действие контроллера, но я мог бы найти что-либо в отношении RSpec и ActionCable.

ответ

7

Вы вероятно, хотят подождать * для https://github.com/rails/rails/pull/23211 для объединения. Он добавляет ActionCable :: TestCase. Как только это слито, ожидать RSpec рельсов команду, чтобы выполнить свою часть работы: https://github.com/rspec/rspec-rails/issues/1606

* Ожидание является необязательным; Вы не можете ждать и основывать свою собственную работу на этой «незавершенной работе» и находить решение, которое работает прямо сейчас.

3

Я бы установить и настроить TCR gem для взаимодействия записи сокетов («его как VCR для WebSockets»)

спецификацию для этого в вашем случае может выглядеть примерно так ...

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

Это очень хорошая идея, спасибо, но (и поправьте меня, если я ошибаюсь) с использованием видеомагнитофона (и TCR аналогично) имеет смысл, когда вы хотите заглушить внешние HTTP-запросы (например, если мое действие контроллера вызывает внешний вызов), но здесь это не так - здесь я просто хочу вызвать свои собственные внутренние методы. Но еще раз - это хорошая идея, и я отдам это. – Dani

+0

Эй, Дани, ты нашел решение? Если да, можете ли вы указать репо, что я мог бы проверить? –

1

Вы можете использовать драгоценный камень `action-cable-testing`.

Добавьте это в Gemfile
gem 'action-cable-testing'
Затем запустите
$ 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 

Для получения дополнительной информации см ридми в GitHub репо.

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

Есть примеры как RSpec и test_case

+1

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится.- [Из обзора] (/ review/low-quality-posts/18680949) –

+1

@MaximilianPeters Я думаю, что теперь это более читаемо. – zhisme