如何测试实例变量是在RSpec控制器中实例化的

时间:2010-01-12 18:31:24

标签: ruby rspec

我正在尝试检查我的RESTful控制器中的新操作是否设置了所需Object类型的实例变量。看起来非常典型,但执行它时遇到了麻烦

客户端控制器

def new
  @client = Client.new
end  

测试

describe "GET 'new'" do
  it "should be successful" do
    get 'new'
    response.should be_success
  end

  it "should create a new client" do
    get 'new'
    assigns(:client).should == Client.new
  end
end

结果......

'ClientsController GET 'new' should create a new client' FAILED
  expected: #,
       got: # (using ==)

这可能是因为它试图比较两个不同的活动记录实例。那么,我如何检查控制器是否设置了一个包含Client模型新实例的实例变量。

3 个答案:

答案 0 :(得分:37)

#rspec中的技术标题帮助了我......

assigns(:client).should be_kind_of(Client)

答案 1 :(得分:15)

你可以使用Rails的new_record吗?检查给定实例是否已经保存到数据库的方法:

assigns(:client).should be_a(Client)
assigns(:client).should be_new_record

(根据以下情况,您不能使用[:client]分配:http://guides.rubyonrails.org/testing.html#the-four-hashes-of-the-apocalypse

答案 2 :(得分:14)

对于2016 RSpec v3语法,请使用:

expect(assigns(:client)).to be_a(Client)

此外,对于因问题标题可能在此停留的其他人,以下是如何测试实例变量@client是否设置为任何内容

# in controller action
@client = Client.find_by(name: "John")

# spec assignment based on collection membership

expect(assigns.keys).to include('client')

请参阅@Attila Györffy's answer,了解为什么必须使用字符串键访问分配哈希。