在Rails API控制器中测试销毁操作

时间:2014-01-21 20:14:31

标签: ruby-on-rails ruby ruby-on-rails-3 rspec

我正在使用Rails 4.0构建RESTful JSON API并使用mongoid作为我的数据库。我正在使用RSpec测试我的一个控制器的destroy动作。但是,当我运行我的测试时,我收到ActionController :: UrlGenerationError:因为Rails无法找到相应的路由。奇怪的是我的destroy动作在我的routes.rb文件和我在同一资源中的其他控制器动作中明确定义。

        describe "DELETE 'delete credit cards'" do
    before do
        @credit = CreditCard.new(cc_last4: Random.rand(1234) ) 
    end

    it "should return a successful json response" do
        params = {comicbook_uid: @user.comicbook_uid.to_s , 
                  notebook_token: @user.comicbook_token, 
                  cc_id: @credit.id, format: :json } 

        delete :destroy, params

        body_hash = JSON.parse response.body

        expect(body_hash["success"]).to eql true
    end

在我的终端中生成的错误是:

   Failure/Error: delete :destroy, params
   ActionController::UrlGenerationError:

     No route matches {:comicbook_uid=>"52decf924761625bdf000000",  :comicbook_token=>"sfsakjhfk",      
                :cc_id=>BSON::ObjectId('52decf924761625bdf020000'), 
                :format=>:json, :controller=>"credit_cards", 
                :action=>"destroy"}

我的信用卡资源路线如下:

 resources :credit_cards, only: [:create, :index, :destroy], 
 :defaults => { :format => 'json'}

提前感谢您,希望能尽快帮助我!

1 个答案:

答案 0 :(得分:0)

您没有传递id属性,这是您实际需要的唯一参数。此外,由于您使用@credit创建CreditCard.new(...)对象,因此在将其持久保存到数据库之前,它实际上不会有ID。

替换:

it "should return a successful json response" do
    params = {comicbook_uid: @user.comicbook_uid.to_s , 
              notebook_token: @user.comicbook_token, 
              cc_id: @credit.id, format: :json }

使用:

it "should return a successful json response" do
    params = {id: @credit.id, format: :json }

并确保坚持使用CreditCard(或设置模拟期望将其销毁)。