0

我用来在 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 方法进行存根?

4

2 回答 2

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

祝你好运!

于 2013-02-14T21:00:25.157 回答
0

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

与其尝试存根,不如给您的测试提供一个与VCR的模拟 Internet 连接?

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

如果你订阅了RailsCasts ,Ryan 在第 291 集中制作了一个关于 VCR 的视频

于 2013-02-14T21:25:08.177 回答