2016-02-05 85 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方法更新數據庫,並定義了兩個流穿過通道播出,但具體細節不是很重要,因爲我的問題是一個比較一般一個:

  • 我怎樣才能建立一個測試,測試通過訂閱 此通道涉及的邏輯是什麼?

RSpec在測試類似控制器動作之類的交互時提供了很多幫助方法和各種實用程序,但是我可以找到任何關於RSpec和ActionCable的東西。

回答

3

我會安裝並記錄插座交互配置TCR gem(「它就像錄像機進行的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

這是一個非常不錯的主意,謝謝你,但(和糾正我,如果我錯了)用VCR(與TCR類似)是有道理的,當你想要存儲外部http請求(例如,如果我的控制器操作發出外部調用),但這裏並不是這種情況 - 這裏我只想調用我自己的內部方法。但再一次 - 這是一個好主意,我會放棄它。 – Dani

+0

嘿丹妮,你找到了解決方案嗎?如果是這樣,你能否指出我可以檢查的回購協議? –

1

您可以使用`action-cable-testing` gem。

添加到您的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