如何在rspec中传递带有消息的对象?

时间:2016-04-21 16:18:21

标签: ruby-on-rails rspec

我在尝试为我帮助做出贡献的应用编写测试时遇到了麻烦。我会事先承认我的才能肯定是在开发的前端,所以当谈到rpsec测试时,我并不是最伟大的。

我基本上是为一个位置创建测试,我有一个管理员可以创建一个新位置。我还为这些地点创建了一家工厂。最终我遇到的问题是当我尝试将位置的计数级别提高1时。我最终会出现错误说明

'change' requires either an object and message ('change(obj, :msg)') or a block ('change { }'). You passed an object but no message.

我真的不知道自己可以做些什么来解决这个问题,所以我想知道是否有人可以采取雄鹅和我所做的事情。

这是我的工厂:

FactoryGirl.define do
 factory :location do |c|
  c.name 'sample location'
  c.phone '5555555555'
  c.fax '5555555555'
  location_id '123456'
  association :address, factory: :address
end

这是我的规格。

require 'spec_helper'

describe Admin::LocationController, type: :controller do
 before(:all) do
   @admin = create(:admin)
   @location = create(:location)
 end

after(:all) do
  @admin.destroy
  @location.destroy
end

let(:admin) {@admin}
let(:location) {@location}

before(:each) do
  sign_in(:user, admin)
end

describe '#create' do
  it 'creates a new location' do

    expect{
      post :create, location:{
        name: 'sample location',
        phone: '5555555555',
        fax: '5555555555',
        location_id: '123456',

        address_attributes: {
          address1: '12345 Some St',
          city: 'Portland',
          state: 'OR',
          zip: '91237'
        }
      }
    }.to change(Location.count).by(1)

    new_location = Location.last
    expect(new_location.name).to eq 'sample location'
    expect(new_location.phone).to eq '5555555555'
    expect(new_location.fax).to eq '5555555555'
    expect(new_location.location_id). to eq '123456'
    expect(new_location.address.address1).to eq '12345 Some St'
    expect(new_location.address.city).to eq 'Portland'
    expect(new_location.address.state).to eq 'OR'
    expect(new_location.address.zip).to eq '91237'
   end
 end
end

3 个答案:

答案 0 :(得分:4)

试试这个:

}.to change(Location, :count).by(1)

OR

}.to change { Location.count }.by(1)

而不是

}.to change(Location.count).by(1)

答案 1 :(得分:1)

错误告诉您正在向change方法传递错误的参数。 change方法需要传递一个块。

}.to change { Location.count }.by(1)

它还提到了一种替代语法,即传递对象/模型(Location)和消息(以符号格式调用的方法,在本例中为:count

}.to change(Location, :count).by(1)

答案 2 :(得分:-1)

错误确切地说明了您需要做什么 - 将对象放在document.addEventListener('DOMContentLoaded', function() { document.getElementById('example').addEventListener('focus', function() { alert('The input is focused.'); }); }); 括号中。这可能会有所帮助:

{}