我有这个模型
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。如果我在工厂中更改要创建的构建,我可以在日志中看到属性已更新,但在测试中使用它时为null并且测试失败。
答案 0 :(得分:1)
测试中的语法看起来不对。 Rspec引入了expect
语法,而不是:
foo.should eq(bar)
foo.should_not eq(bar)
你可以这样做:
expect(foo).to eq(bar)
expect(foo).not_to eq(bar)
您将expect
与should
混合在一起,所以我想这会导致您的测试失败。
答案 1 :(得分: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 :(得分:0)
你应该改变期望,因为@benjaminjosephw建议。
但我认为您的规格中还有其他问题。当你创建user
时,remote_id
实际上等于nil(我的意思是在构建之后但在创建之前)。当您创建user
时,您在数据库中更新了属性remote_id
,但您的对象user
仍然没有此值。您应该reload
反对从DB获取此数据。
before { @user = FactoryGirl.build(:user) }
it "has_remote_id" do
@user.save! && @user.reload
expect(@user.remote_id).not_not be_nil
end