用于OpenTok对象的Stubbing实例方法

时间:2013-02-12 07:13:19

标签: ruby-on-rails rspec stub

我用来在我的Rails应用程序中集成OpenTok的gem位于:https://github.com/opentok/Opentok-Ruby-SDK。我在此示例中基于应用程序的核心:http://www.tokbox.com/blog/building-a-video-party-app-with-ruby-on-rails

在代码的相关部分,我在config_opentok方法中创建一个@opentok对象:

    def config_opentok
        if @api_key.nil? or @api_secret.nil?
            if Rails.env.development?
                @api_key = API_KEY
                @api_secret = API_SECRET
            else
                @api_key = ENV['API_KEY']
                @api_secret = ENV['API_SECRET']
            end
        end
        if @opentok.nil?
            @opentok = OpenTok::OpenTokSDK.new(@api_key, @api_secret)
        end
    end

我正在使用以下代码创建会话:

    config_opentok

    if Rails.env.development?
        session = @opentok.create_session('localhost')
    else
        session = @opentok.create_session(request.remote_addr)
    end

麻烦的是,create_session似乎抛出错误

SocketError: getaddrinfo: nodename nor servname provided, or not known

每当我在没有互联网连接的情况下运行Rspec测试时。所以我想将该方法存根,以便它只返回一个哈希{:sessionId => 1}。但我无法弄清楚如何存根方法。我不能只是存根OpenTok模块或OpenTok :: OpenTokSDK类。我如何去创建create_session方法呢?

2 个答案:

答案 0 :(得分:0)

这就是我一直在做的事情:

首先,我倾向于在应用程序加载时初始化OpenTok对象,因此我不会在每个请求上创建OpenTok对象。为此,我在config / initializers文件夹中创建了一个ruby文件(apis.rb)。

我的apis.rb看起来像这样:

TB_KEY = ENV['TB_KEY']
TB_SECRET = ENV['TB_SECRET']
OTSDK = OpenTok::OpenTokSDK.new TB_KEY, TB_SECRET

在我的控制器中,为了生成会话,我只需拨打OTSDK.createSession,就像你已经拥有的一样。

要使用rspec进行测试,您只需写入测试文件:

OTSDK.stub(:createSession).and_return( {:sessionId => "1MX_2A3453095J0TJ30..."} )

如果在关闭wifi的情况下运行rspec,则调用createSession不应再抛出错误。

以下是rspec存根的文档:http://rubydoc.info/gems/rspec-mocks/frames

祝你好运!

答案 1 :(得分:0)

  

问题是,每当我在没有互联网连接的情况下运行Rspec测试时,create_session似乎都会抛出错误。

为什么不给你的测试提供与VCR的模拟互联网连接,而不是试图存根?

初始设置后,VCR可让您运行所有测试,就好像您已主动连接到互联网一样。这允许您脱机运行测试,加速所有需要活动连接的测试,并为您提供一致的结果集。

如果您订阅了RailsCasts,则Ryan在episode 291

中制作了有关VCR的视频