【问题标题】:How can I test a model with rspec that has after_create callback如何使用具有 after_create 回调的 rspec 测试模型
【发布时间】:2014-12-24 19:04:20
【问题描述】:

我有这个模型

class User < ActiveRecord::Base
  after_create :create_in_remote

  def create_in_remote
   if self.remote_id.nil?
    req_url = "api/create/user/#{self.username}"
    response = Remote.execute_request(req_url)
    if response
      self.update_attribute(:remote_id, response["id"]) if response["id"]
    end
   end
  end
end

在我的规范中,我尝试这样做

require 'spec_helper'

describe User do
  before { @user = FactoryGirl.build(:user) }

  subject { @user }


  it "has_remote_id" do
    @user.save! && @user.reload
    expect(@user.remote_id).not_to be_nil
  end
end

但从未通过测试,但始终在远程 api 上创建对象。如果我想查看@user 对象的属性remote_id 的值始终为null。如果我将 build 更改为在工厂中创建,我可以在日志中看到属性已更新,但在测试中使用时它为 null 并且测试失败。

【问题讨论】:

  • 我会在 create_in_remote 中打印出响应,看看是否收到响应和响应 ["id"]。我还会在测试中打印出用户对象,并尝试调用 user.reload 以确保它是对象的当前状态。

标签: ruby-on-rails ruby rspec ruby-test


【解决方案1】:

试试这个以确保回调被调用并期望(user.remote_ip).to eq(...) - 检查remote_ip

describe 'after_create' do
  before { @user = User.new }
  it 'run the create_in_remote callback' do
    expect(@user).to receive(:create_in_remote) 
    @user.run_callbacks(:create) 
  end
end

【讨论】:

    【解决方案2】:

    您的测试中的语法看起来有问题。 Rspec 引入了expect 语法,以便代替:

    foo.should eq(bar)
    foo.should_not eq(bar)
    

    你可以这样做:

    expect(foo).to eq(bar)
    expect(foo).not_to eq(bar)
    

    您将expectshould 混合在一起,所以我想这会导致您的测试失败。

    这是一篇关于 Rspec's new expectation syntax 的好博文

    【讨论】:

      【解决方案3】:

      您应该按照@benjaminjosephw 的建议改变期望。

      但我认为您的规范中还有另一个问题。当您创建 user 时,它实际上有 remote_id 等于 nil(我的意思是在构建之后但在创建之前)。当您创建 user 时,您会在 DB 中更新属性 remote_id,但您的对象 user 仍然没有此值。您应该 reload 对象从数据库中获取此数据。

      before { @user = FactoryGirl.build(:user) }
      
      it "has_remote_id" do
        @user.save! && @user.reload
        expect(@user.remote_id).not_not be_nil
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多