无法在Twitter gem的user_timline上使用any_instance

时间:2015-03-05 18:20:47

标签: ruby twitter mocking stub

我对Ruby仍然很新鲜,特别是在Ruby中进行测试。希望代码不是一个火车残骸:)我在使用任何关于Twitter宝石的问题时遇到问题,而它在我自己的课程中工作正常。

这是(我相信)相关代码

require 'twitter'

require 'minitest/unit'
require 'mocha/mini_test'

omitting for brevity....

 args = { id: 573536452149182464, id_str: 73536452149182464, text: 'This is an initial tweet from the user'}
 initial_tweet = ::Twitter::Tweet.new(args)
 ::Twitter::REST::Timelines.any_instance.stubs(:user_timeline).returns(initial_tweet)

代码产生以下错误:

 Minitest::UnexpectedError: NoMethodError: undefined method `any_instance|' for Twitter::REST::Timelines:Module

扼杀宝石的原则是不同的,我接近错了吗?

编辑:我已经为下面两个类添加了整个代码。

twitter.rb

require 'rubygems'
require 'cinch'
require 'cinch/commands'
require 'twitter'
require 'shorturl'

module Gigabot
 module Commands
   class Twitter
     include Cinch::Plugin
     include Cinch::Commands

      def initialize(bot)
       super(bot)
       @client = create_client
       @follow = config[:follow]
       @channels = bot.config.channels
       @latest_tweets = Hash.new
       set_initial_tweets
      end

     timer 60, method: :twitter_update
     def twitter_update
         @follow.each do |user|
            new_tweet = @client.user_timeline(user, options = {exclude_replies: true}).first
            if @latest_tweets[user] != new_tweet
            short_url = ShortURL.shorten("https://twitter.com/#{user}/status/#{new_tweet.id}")
            reply = Format(:bold, "<#{user}> ") + "#{new_tweet.full_text} [#{short_url}]"
            reply = reply.gsub(/\n/,' ')

            @channels.each {|channel| Channel(channel).send(reply)}
            @latest_tweets[user] = new_tweet
          end
        end
      end


      private
      def create_client
        ::Twitter::REST::Client.new do |c|
          c.consumer_key        = config[:consumer_key]
          c.consumer_secret     = config[:consumer_secret]
          c.access_token        = config[:access_token]
          c.access_token_secret = config[:access_token_secret]
        end
     end

      def set_initial_tweets
         @follow.each do |user|
           @latest_tweets[user] = @client.user_timeline(user, options = {exclude_replies: true}).first
        end
     end
   end
 end

twitter_test.rb

require 'twitter'

require 'minitest/unit'
require 'mocha/mini_test'


require File.dirname(__FILE__) + '/../../../helper'
require File.dirname(__FILE__) + '/../../../../lib/gigabot/commands/twitter'

module Gigabot
  module Commands
    class TwitterTest < TestCase

       def setup
        bot = Cinch::Bot.new
        bot.loggers.level = :fatal

        bot.config.plugins.options[Twitter] = {
            consumer_key: 'test_key',
            consumer_secret: 'test_key_secret',
            access_token: 'test_access_token',
            access_token_secret: 'test_access_token_secret',
            follow: %w(follow1 follow2)
        }

        args = { id: 573536452149182464, id_str: 73536452149182464, text: 'This is an initial tweet from the user'}
        initial_tweet = ::Twitter::Tweet.new(args)
        ::Twitter::REST::Timelines.any_instance.stubs(:user_timeline).returns(initial_tweet)
        @plugin = Twitter.new(bot)
       end

       def test_create_twitter_client_on_initialize
         refute_nil(@plugin.instance_variable_get(:@client))
       end

     end
   end
 end

0 个答案:

没有答案