2015-01-19 2 views
0

В моем контроллере rails я пытаюсь написать тест для метода search_backups. Проблема, с которой я сталкиваюсь, заключается в том, что devices_ids_from_elastic = ConfigTextSearch.search search_term ничего не возвращает, поэтому тестовые прогоны .map на devices_ids_from_elastic, который является неправильным #<String:0x007f8a90b67ca0>.Rspec Stubbing Object.map()

Как исправить ошибку devices_ids_from_elastic.map(), чтобы исправить эту проблему?

Failures: 

    1) ReportsController access control allows architects to search backups 
    Failure/Error: post 'search_backups' 
    NoMethodError: 
     undefined method `each_pair' for #<String:0x007f8a90b67ca0> 
    # ./app/controllers/reports_controller.rb:19:in `map' 
    # ./app/controllers/reports_controller.rb:19:in `elastic_mongo_lookup' 
    # ./app/controllers/reports_controller.rb:32:in `search_backups' 
    # ./spec/controllers/reports_controller_spec.rb:123:in `block (3 levels) in <top (required)>' 

тест:

describe "controller method test" do 
    before do 
     allow(CSV).to receive(:generate).and_return("1234, blah") 
     stub_request(:get, "http://localhost:9200/mongo_index/config_files/_search?q="). 
     with(:headers => {'Expect'=>'', 'User-Agent'=>'Faraday v0.9.1'}). 
     to_return(:status => 200, :body => '{lots of json stuff in here }', :headers => {}) 


    it "allows users to search backup log files" do 
     reports = double(ReportsController) 
     reports.stub(:map).and_return("help") 
     post 'search_backups' 
    end 

контроллер:

search_backups 
    def elastic_mongo_lookup(search_term) 
     devices_ids_from_elastic = ConfigTextSearch.search search_term 
     device_ids = devices_ids_from_elastic.map { |device| device._source.device_id } 
     csv_string = CSV.generate do |csv| 
      Device.where(:_id.in => device_ids).each do |device| 
      csv << [device.logical_name, device.primary_ip] 
      end 
     end 
     return csv_string 
     end 

    def search_backups 
    authorize! :read, :custom_report 
    csv_string = elastic_mongo_lookup params[:search_term] 
    if csv_string.blank? 
     flash[:notice] = "No results were found" 
     redirect_to reports_path 
    else 
     render text: "DeviceID, primary_ip\n" + csv_string 
    end 
    end#search_backups 
+1

Почему вы не окурок Conf igTextSearch.search и заставить его возвращать пустой массив или массив желаемых объектов? – Hesham

+0

Почему 'reports.stub (ConfigTextSearch.search) .with (" sss "). And_return ([" help "])' give me ArgumentError: неправильное количество аргументов (0 для 1..2) '? – dman

ответ

1

Попробуйте это: allow(ConfigTextSearch).to receive(:search).with({}).and_return([])

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