我正在尝试检查我的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模型新实例的实例变量。
答案 0 :(得分:37)
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,了解为什么必须使用字符串键访问分配哈希。