Ruby RSpec2中的模拟导致单例can';不要倾倒在Sinatra控制器中

Ruby RSpec2中的模拟导致单例can';不要倾倒在Sinatra控制器中,ruby,unit-testing,mocking,sinatra,rspec2,Ruby,Unit Testing,Mocking,Sinatra,Rspec2,我正在尝试编写一个rspec2测试,它会给我一个错误。我知道测试现在没有测试任何特别的东西。但我稍后会添加更多代码,我想先通过这部分 context "/login/twitter" do before(:each) do request_token = double("request_token") request_token.stub(:authorize_url).and_return("http://api.twitter.

我正在尝试编写一个rspec2测试,它会给我一个错误。我知道测试现在没有测试任何特别的东西。但我稍后会添加更多代码,我想先通过这部分

context "/login/twitter" do
        before(:each) do
            request_token = double("request_token")
            request_token.stub(:authorize_url).and_return("http://api.twitter.com/oauth/authenticate?oauth_token")

            TwitterService.any_instance.stub(:authentication_request_token).and_return(request_token)
            get '/login/twitter'
        end

        it "should redirect to twitter authorized url" do
            last_response.header["Location"].should include "http://api.twitter.com/oauth/authenticate?oauth_token"
        end

        it "should redirect back to home page if error occurs" do

        end
    end

这是我的控制器

get '/login/twitter' do
  begin
    request_token = TwitterService.new.authentication_request_token

    session[:request_token_twitter] = request_token

    logger.info(request_token.authorize_url)

    redirect request_token.authorize_url
  rescue Exception => e
    logger.error(e.message)
    redirect '/'
  end  
end
这就是我犯的错误

  1) Server /login/twitter should redirect to twitter authorized url
     Failure/Error: get '/login/twitter'
     TypeError:
       singleton can't be dumped
     # ./spec/twitter_route_spec.rb:25:in `block (3 levels) in <top (required)>'
1)服务器/login/twitter应该重定向到twitter授权的url
失败/错误:获取“/login/twitter”
类型错误:
单身汉不能被抛弃
#./spec/twitter_route_spec.rb:25:in'block(3层)in'

不确定我错过了什么。

为了在会话中粘贴某些内容,它需要序列化,而您的模拟对象不能序列化-rspec模拟的实现似乎使用单例或定义单例方法

您可以尝试并找出需要删除哪些方法,以便假装可以转储对象(可能是
dump
),就个人而言,我只需要将测试请求令牌设置为类似的结构