【问题标题】:RSpec error for destroy action - No route matches销毁操作的 RSpec 错误 - 没有路由匹配
【发布时间】:2019-01-13 02:15:30
【问题描述】:

我正在尝试为我的 user_stocks_controller 的销毁操作编写 rspec 测试,但出现错误:

UserStocksController DELETE #destroy 删除库存失败/错误: 删除:销毁,参数:{ id: user_stock.id }

ActionController::UrlGenerationError: 没有路由匹配 {:action=>"destroy", :controller=>"user_stocks", :id=>nil}

我已经读到存在问题,因为我没有提供库存的 id。我试图以多种不同的方式对其进行更改,但我的想法不正确。

这是我的规格:

let(:user) { User.new(email: 'test@example.com', password: 'password') }

  before do
    sign_in(user)
  end

 describe 'DELETE #destroy' do
    let(:stock) { Stock.new_from_lookup('GS') }
    let(:user_stock) { UserStock.create(user: user.id, stock: stock) }

    it 'deletes stock' do
      expect do
        delete :destroy, params: { id: user_stock.id }
      end.to change(UserStock, :count).by(-1)
      expect(response).to have_http_status(redirect)
      expect(flash[:notice]).to eq 'Stock successfully removed'
    end
  end

user_stocks_controller 中的销毁方法:

  def destroy
    stock = Stock.find(params[:id])
    @user_stock = UserStock.where(user_id: current_user.id, stock_id: stock.id).first
    @user_stock.destroy!
    flash[:notice] = 'Stock successfully removed'
    redirect_to my_portfolio_path
  end

为什么即使我为它设置了id 也没有检测到我的路线?

【问题讨论】:

    标签: ruby-on-rails rspec


    【解决方案1】:

    您使用的是哪个版本的导轨? rspec-rails github repo 中有一些示例,说明如何根据 rails version 5 进行销毁,语法不同。

    如果你的 rails 版本是

    delete :destroy, {id: user_stock.id}

    另一种解决方案是尝试使用删除路径,因此根据您的路线如下所示

    delete "/user_stocks/#{user_stock.id}"

    【讨论】:

    • 我使用的是 Rails 5.2.2。在您的第一个解决方案中,我遇到了一个错误 - ArgumentError: unknown keyword: id 在第二个解决方案中,错误与以前相同 - No route matches
    • 没有路由匹配似乎是一个路由错误您是否尝试过从邮递员调用您的端点?您还可以通过 rake routes 检查您的路由.. 其他选项是在您的 rspec 测试中添加一个 byebug 并确保正确传递了 id 或者硬编码 id 值只是为了查看请求到达控制器操作或不是..
    • 路线很好,因为它会删除生产中的库存。这很奇怪.. 现在我在第二个解决方案中遇到了其他错误:Failure/Error: let(:user_stock) { UserStock.create(user: user.id, stock: stock) } ActiveRecord::AssociationTypeMismatch: User(#70305910165640) expected, got 10 which is an instance of Integer(#70305880349860)
    • UserStock.create(user: user.id, stock: stock) 更改为UserStock.create(user_id: user.id, stock: stock)。您还需要先保存用户,以便它可以有一个 id User.new(email: 'test@example.com', password: 'password').save
    • 感谢@Thanh,但不幸的是它没有帮助 - Failure/Error: sign_in(user) RuntimeError:Could not find a valid mapping for true
    【解决方案2】:

    您好,我正在与Rails 5.2.3 合作,我的解决方案如下:

    delete "/user_stocks/#{user_stock.id}"
    

    但是,在这个线程的一些 cmets 中,我遇到了 No route matches 错误,我的解决方案很简单,只需在 delete 调用之前保存 user_stock 对象。就我而言,我正在使用声明为 UserStock.new 的对象进行测试,因此它没有 id,这就是 delete 调用启动 No route matches 的原因,因为它访问的是这条路径 /user_stocks/ 而不是 user_stocks/:id

    希望这项工作!

    【讨论】:

      猜你喜欢
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      相关资源
      最近更新 更多