失败/错误:使用Rspec发布#create testing

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了失败/错误:使用Rspec发布#create testing相关的知识,希望对你有一定的参考价值。

我是Rspec的新手并且测试一般我在stores_controller_spec.rb文件中有这个代码

require 'rails_helper'

RSpec.describe StoresController, type: :controller do
    let(:vendor) { FactoryBot.create(:vendor) }
    let(:auth_headers) { vendor.create_new_auth_token }
    let(:city) { FactoryBot.create(:city) }
    let(:store) { FactoryBot.create(:store, vendor_id: vendor.id, city_id: city.id) }

    before(:example) do
        request.headers.merge!(auth_headers)
    end

    describe "Post#create" do
        it 'creates a new store' do
            post :create, params: { store: attributes_for(:store) }
            expect(Store.count).to eq(1)
        end
    end
end

factories/store.rb文件:

FactoryBot.define do
    factory :store do
        long Faker::Number.positive
        lat Faker::Number.positive
        store_name Faker::Name.name  
        telephone_number Faker::Number.number(10)
    end
end

factories/city.rb文件:

FactoryBot.define do
    factory :city do
        city_name Faker::Name.name
    end
end

在运行测试后,我得到了这个:

Failures:
    1) StoresController Post#create creates a new store    
    Failure/Error: expect(Store.count).to eq(1)

   expected: 1
        got: 0

StoresContoller.rb

class StoresController < ApplicationController
    before_action :authenticate_vendor!

    def create
      @store = Store.new(store_params)
      if @store.save
        render json: @store, status: :created, location: @store
      else
        render json: @store.errors, status: :unprocessable_entity
      end
    end

    private
      def store_params
        params.require(:store).permit(:vendor_id, :city_id, :store_name, :long, :lat, :telephone_number)
      end
end

我应该提到Store belongs_to :citybelongs_to :vendor,当我在expect(store).to be_valid线后测试同一块上的post :create时,测试通过了!

你能解释一下我做错了什么吗?

答案

我相信您不需要在请求中的密钥params下传递商店属性。更改此行,看看它是否有效:

post :create, { store: attributes_for(:store).merge(city_id: city.id, vendor_id: vendor.id) }

您的工厂:store也不会在没有更改的情况下创建有效记录:

FactoryBot.define do
  factory :store do
    ...
    association :city
    association :vendor
  end
end

以上是关于失败/错误:使用Rspec发布#create testing的主要内容,如果未能解决你的问题,请参考以下文章

失败/错误:需要'rspec/rails'类型错误:错误的参数类型类(预期模块)Rspec V3

如何让 rspec-2 提供与测试失败相关的完整跟踪?

RSpec 测试失败 - 使用显示套接字但缺少锁定文件

rspec 测试错误数量的参数

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

Rails RSpec中未定义的方法“create”