2015-02-03 3 views
0

Я следующий модуль:не определен метод, рельсы 4.1.9, RSpec 3.1

module BlackBird 
    module PublishToSites 
    module User 

     @site = nil 

     @params = nil 

     @times = 5 

     def self.publish_user(params, request_url) 
     if Site.all != nil 
      threads = [] 
      Site.all.each do |s| 
      @site = s 
      @params = params 
      threads << Thread.new do 
       responses = rescue_500(5) { publish(s, params) } 
       deal_with_response(s, responses, request_url) 
      end 
      end 

      return threads 
     else 
      # Send Email 
      # - Use No Sites Template 
     end 
     end 

     private 

     def self.publish(site, params) 
     response = Typhoeus.post(
     site.site_api_url + 'users', 
     :body => params.to_json, 
     :headers => { 
      "Authorization" => "Token token=\"#{site.site_api_key}\"", 
      'Content-Type' => 'application/json' 
      } 
     ) 
     return response 
     end 

     def self.rescue_500(n , &block) 
     responses = [] 
     (n-1).times { 
      response = block.call 
      if response.code == 500 
      responses << response 
      sleep 15 
      else 
      responses << response 
      return responses.uniq(&:code) 
      end 
     } 

     responses << block.call 
     return responses.uniq(&:code) 
     end 

     def deal_with_response(site, responses, request_url) 
     response.each do |response| 
      if response.code == 200 
      send_request(site.site_api_url, site.site_api_key, response, request_url) 
      elsif response.code == 404 
      send_request(site.site_api_url, site.site_api_key, response, request_url) 
      GeneralMailer.recieved_404(ENV['ADMINISTRATOR_NAME'], ENV['ADMINISTRATOR_EMAIL'], site, response).deliver_now 
      elsif response.code == 500 
      send_request(site.site_api_url, site.site_api_key, response, request_url) 
      GeneralMailer.recieved_500(ENV['ADMINISTRATOR_NAME'], ENV['ADMINISTRATOR_EMAIL'], site, response).deliver_now 
      else 
      send_request(site.site_api_url, site.site_api_key, response, request_url) 
      GeneralMailer.recieved_error(ENV['ADMINISTRATOR_NAME'], ENV['ADMINISTRATOR_EMAIL'], site, response).deliver_now 
      end 
     end 
     end 

     def send_request(site, api_key, response, from_site) 
     # do something here. 
     end 
    end 
    end 
end 

Он содержит следующий метод, под private называется deal_with_response(site, responses, request_url)

Тот факт, что его «частный» не вызывает эта ошибка, потому что у меня есть другие тесты, которые проверяют метод rescue_500.

Следующий тест:

it "should send no email (200)" do 
    response = double("response", :code => 200) 
    site = double("site", :site_api_url => 'http://google.ca', site_api_key: 'sdsadsasada') 
    send_request_method = double() 
    send_request_method.stub(:send_request).with(site.site_api_url, site.site_api_key, [response], 'http://google.ca').and_return nil 

    expect{ BlackBird::PublishToSites::User.deal_with_response(site.site_api_url, response, 'http://google.ca') }.to_not change{ ActionMailer::Base.deliveries.count } 
end 

терпит неудачу из-за того, что:

1) BlackBird::PublishToSites::User Test that emails are being sent should send no email (200) 
    Failure/Error: expect{ BlackBird::PublishToSites::User.deal_with_response(site.site_api_url, response, 'http://google.ca') }.to_not change{ ActionMailer::Base.deliveries.count } 
    NoMethodError: 
     undefined method `deal_with_response' for BlackBird::PublishToSites::User:Module 
    # ./spec/blackbird/publish_to_sites/user_spec.rb:129:in `(root)' 
    # ./spec/blackbird/publish_to_sites/user_spec.rb:129:in `(root)' 

Line 129 в данном случае:

expect{ BlackBird::PublishToSites::User.deal_with_response(site.site_api_url, response, 'http://google.ca') }.to_not change{ ActionMailer::Base.deliveries.count } 

Как это: deal_with_response неопределенных для этого модуль? Я что-то упускаю? опечатка? Я просмотрел его более 5 раз, я назову правильный метод ....

ответ

1

Другие методы в модуле определяются как методы модуля (с def self.method_name) и, таким образом, могут быть вызваны самим модулем без инкапсулирующего объекта. Метод deal_with_response не определен таким образом и поэтому является методом экземпляра, который может быть вызван только как метод экземпляра для класса при включении модуля.

Source.

Смежные вопросы