2016-01-02 29 views
0

我想知道如何从rspec的Controller上测试这个format.json。下面是我想捂住代码:用rspec覆盖format.json

控制器:

def edit 
    @ngo = Ngo.find(params[:id]) 
    respond_to do |format| 
    if request.xhr? 
     if params[:zipcode] 
     format.json { render json: Address.new(Correios::CEP::AddressFinder.get(params[:zipcode]))} 
     end 
    else 
     @phones = Hash[@ngo.phones.map {|phone| [phone.id.to_s ,phone.phone_number]}] 
     @phones = @phones.to_json 
     format.html 
    end 
    end 
end 

我已经尝试了一些办法,但没有成功。任何人都知道我该怎么做?谢谢:)

+0

这将是有益的向我们展示了,你已经尝试并没有奏效。 – hotzst

+0

我试过从json得到任何回应,期望(JSON.parse(response.body))。到eq('1231') 但我真的不知道我在做什么tbh。 –

+0

你没有显示你的规范代码......但通常类似的问题是错过['render_views'](https://www.relishapp.com/rspec/rspec-rails/v/2-1/docs/规格文件中的控制器规格/渲染视图)。原因:RSpec尝试加速测试,并且默认情况下不呈现响应。 – gotva

回答

0

这可能适合你。它涉及到我做了一些我从未尝试过的事情,例如xhr :post, :edit和模块继承.get调用,但我认为它看起来不错。让我知道这个是否奏效!

# spec/controllers/some_controller_spec.rb 

describe SomeController, type: :controller do 
    context "#edit" do 
    it "renders address as json" do 
     ngo = double(:ngo, id: "1") 
     correios_obj = double(:correios_obj) 
     json_address = double(:json_address) 
     expect(Ngo).to receive(:find).with("1").and_return(ngo) 
     expect(Correios::CEP::AddressFinder).to receive(:get).with("35950").and_return(correios_obj) 
     expect(Address).to receive(:new).with(correios_obj).and_return(json_address) 
     xhr :post, :edit, zipcode: "35950", id: "1" 
     expect(response.body).to eq json_address 
    end 
    end 
end 

而且this SO post帮我与XHR部分