Ruby on rails 在设置了当前模块的情况下,如何在rspec中调用模块方法
因此,我有下面的模块来处理tweet的获取和保存。这都是在一个线程上完成的,我感兴趣的是在这个模块中测试两个方法:Ruby on rails 在设置了当前模块的情况下,如何在rspec中调用模块方法,ruby-on-rails,ruby,rspec,module,Ruby On Rails,Ruby,Rspec,Module,因此,我有下面的模块来处理tweet的获取和保存。这都是在一个线程上完成的,我感兴趣的是在这个模块中测试两个方法:fetch\u tweets和save\u tweets 对于fetch_tweets,我想验证是否调用了save_tweets方法。我不在乎它会返回什么 对于save_tweets,我想测试一条tweet是否被实际保存 考虑到这一点,我们来看一些代码 Twitter::TwitterHandler-它位于lib/Twitter/Twitter\u handler.rb module
fetch\u tweets
和save\u tweets
对于fetch_tweets
,我想验证是否调用了save_tweets
方法。我不在乎它会返回什么
对于save_tweets
,我想测试一条tweet是否被实际保存
考虑到这一点,我们来看一些代码
Twitter::TwitterHandler-它位于lib/Twitter/Twitter\u handler.rb
module Twitter
module TwitterHandler
def handle_tweets(twitter_client_object)
Thread.new do
begin
twitter_lock(twitter_client_object)
ensure
ActiveRecord::Base.clear_active_connections!
end
end
end
def twitter_lock(twitter_client_object)
TwitterTweet.with_advisory_lock('aisis-writer-tweets', 0) do
fetch_tweets(twitter_client_object)
end
end
def fetch_tweets(twitter_client_object)
Rails.cache.fetch([:aisis_twitter_feed, Time.now.to_i/60/5], expires_in: 1.minute){
twitter_client.user_timeline(user_id: '252157965', count: 100).map(&:as_json).select{ |h| h["text"].match(/aisiswriter/i) }.take(10).each do |tweet|
save_tweets(tweet['id_str'], tweet['text'], tweet['created_at'])
end
}
end
def save_tweets(id, text, created_at)
tweet = TwitterTweet.find_or_initialize_by(id: id)
tweet.text = text
tweet.created_at = created_at
tweet.save
end
end
end
twitter\u handler\u spec.rb-它位于spec/twitter/twitter\u handler\u spec.rb中
require 'rails_helper'
require_relative '../../lib/twitter/twitter_handler'
describe 'TwitterHandler' do
context "fetch tweets method" do
it "should fetch some tweets" do
t = Time.parse("01/01/2010 10:00")
Time.should_receive(:now).and_return(t)
expect(fetch_tweets(twitter_client)).to receive(:save_tweets).with('342', 'Something', t).and_return nil
end
end
end
当我运行bin/rspec spec/twitter/twitter\u handler\u spec.rb
时,我得到:
Failures:
1) TwitterHandler fetch tweets method should fetch some tweets
Failure/Error: expect(fetch_tweets(twitter_client)).to receive(:save_tweets).with('342', 'Something', t).and_return nil
NoMethodError:
undefined method `fetch_tweets' for #<RSpec::ExampleGroups::TwitterHandler::FetchTweetsMethod:0x007ff1c724e300>
# ./spec/twitter/twitter_handler_spec.rb:11:in `block (3 levels) in <top (required)>'
故障:
1) TwitterHandler获取tweets方法应获取一些tweets
失败/错误:期望(fetch_tweets(twitter_client))。接收(:save_tweets)。带有('342','Something',t)。并且返回nil
命名错误:
未定义的方法“fetch_tweets”#
#./spec/twitter/twitter\u handler\u spec.rb:11:in'block(3级)in'
如何修复此问题,以便调用此方法和此模块中的任何其他方法?您不能调用模块的实例方法。您必须
包含
或扩展
模块,然后调用包含或扩展模块的对象上的方法。从rspec中得到的错误是因为您正在示例中调用fetch\u tweets
,但是示例中没有定义fetch\u tweets
一旦您解决了调用fetch\u tweets
的问题,那么您就必须处理这样一个事实:您的expect(fetch\u tweets(…)
expectation表示fetch\u tweets
返回的对象将接收:save\u tweets
的方法调用,这不是您想要的。根据您的描述,您希望设置一个期望,即包含或扩展的任何对象TwitterHandler
都将接收save\u tweets
,然后您希望调用fetch\u tweets
如果这还不清楚,我建议您先阅读Ruby模块方法,然后再阅读RSpec