使用应该匹配器使用 RSPEC 测试我的控制器时发生错误,特别是创建我无法测试保存功能

Posted

技术标签:

【中文标题】使用应该匹配器使用 RSPEC 测试我的控制器时发生错误,特别是创建我无法测试保存功能【英文标题】:Error occuring in testing my controller with RSPEC using shoulda matchers especially create i can't able to test save functionality 【发布时间】:2021-12-24 20:17:49 【问题描述】:

我正在使用 shoulda 匹配器使用 RSPEC 测试我的控制器,而我在控制器中遇到了 create 方法,如果我尝试这样做,我无法测试保存功能,我会出错

预期的响应是 ,但实际上是 我已经附上了我的控制器部分和测试和路由

测试中

 RSpec.describe "routes for home", type: :routing do
   describe 'post #create' do
      before do
        post :create , params: params
      end
    
      context 'when the params are correct' do
        let(:params)   restaurant:  restaurantname: "Buhari" ,location_id: 1  

        it 'is expected save successfully and redirect_to gridpage' do
         expect(assigns[:restaurant].save).to redirect_to(gridurl_path)
        end


    end

 end
end

在控制器中

  def create
    # render plain: params
    @restaurant=Restaurant.new(restaurant_params)


    if @restaurant.save
        redirect_to gridurl_path
    else
        render 'index'
    end
  end

在路线中

  post "/home/create", to: "home#create", as: :createurl
  get '/home/grid', to: 'home#grid',as: :gridurl

提前谢谢你

【问题讨论】:

【参考方案1】:

首先我建议您阅读https://relishapp.com/rspec/rspec-rails/docs/controller-specs 以及其他文档。他们将为您提供一个很好的起点,让您了解如何使用 rspec 测试内容。

当您查看控制器操作时,您对谁在做什么(即assigns[:restaurant])不感兴趣-您想查看是否发生重定向,是否将某些内容保存在数据库中等。从调用该端点的用户的视角。用户是否了解所有内部信息?

它应该是这样的:

describe "routes for home", type: :controller do
  describe 'post #create' do
    context 'when the params are correct' do
      let(:params)   restaurant:  restaurantname: "Buhari" ,location_id: 1  

      it 'is expected save successfully and redirect_to gridpage' do
        post :create, params: params
        expect(response).to redirect_to('/home/grid')
      end
    end
  end
end

【讨论】:

以上是关于使用应该匹配器使用 RSPEC 测试我的控制器时发生错误,特别是创建我无法测试保存功能的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 shoulda 匹配器获得唯一性验证测试通过

使用 RSpec & Rails 测试给定布局的渲染

如何使用 Capybara Rspec Matchers 测试演示者?

RSpec 测试使用表单构建器元素的方法

rspec 使用 draper Decorator 测试视图

SystemStackError - 堆栈级别太深;在 Rspec 测试中,使用acts_as_audited、Rspec、数据库清理器