需要Ruby规范:收到任何参数时1次:0次(带任何参数)

fjaof16o  于 2022-12-22  发布在  Ruby
关注(0)|答案(1)|浏览(92)

在运行我的规范时出现错误,我猜可能是update_all已经被弃用了。

    • 代码:**
def update_the_members_email
    self.the_members.update_all(email: self.email)
end
    • 规格:**
describe 'update_the_members_email' do

    describe 'when after_save is triggered' do
       let(:updated_email) { Faker::Internet.safe_email }
        before do
          user.email = updated_email
          user.save
        end
      it 'triggers update_all' do
        expect(user).to receive_message_chain(:the_members, :update_all).with({ :email => updated_email })
      end
    end
  end
end
    • 错误:**

'1)触发after_save时用户update_the_members_email触发update_all失败/错误:期望(用户)。接收消息链(:成员,:更新所有)。使用({:email =〉新电子邮件})

[....].the_members(*(any args))
       expected: 1 time with any arguments
       received: 0 times with any arguments

'
我试过使用update_column而不是update_all。尝试了其他一些方法来说明这一点。花了大量的时间进行研究。

bz4sfanl

bz4sfanl1#

假设update_the_members_email由保存后回调调用...
The mock必须在调用之前设置。before发生在测试 * 之前 *。因此user.email发生在 * 之前 * 您设置了预期。预期永远不会看到它。

describe 'after save callbacks' do
  it 'updates all members email when the email is updated' do
    updated_email = Faker::Internet.safe_email

    expect(user).to receive_message_chain(:the_members, :update_all)
      .with(email: updated_email )

    user.update!(email: updated_email)
  end
end

注意,这里不需要模拟,只要确保用户有一些成员,然后直接测试即可。

describe 'after save callbacks' do
  let(:updated_email) { Faker::Internet.safe_email }

  context 'when the user email is updated' do
    before do
      user.update!(email: updated_email)
    end

    it 'updates all members email when the email is updated' do
      # I'm assuming the user has members.
      expect(user.the_members).to all have_attributes(email: updated_email)
    end
  end
end
  • 无需将self附加到方法调用中。the_members.update_all(email: email)
  • 使用Ruby 2.0风格传递命名参数:with(email: updated_email)
  • 尝试rubocoprubocop-rspec来告诉你好的风格。

相关问题