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

fak*_*tic 35 ruby rspec

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

客户控制器

def new
  @client = Client.new
end  
Run Code Online (Sandbox Code Playgroud)

测试

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
Run Code Online (Sandbox Code Playgroud)

结果是...

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

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

fak*_*tic 37

#rspec的技术支持帮我解决了......

assigns(:client).should be_kind_of(Client)
Run Code Online (Sandbox Code Playgroud)

  • 对于rails 5,使用`expect(assign(:client).to be_a(Client)` (3认同)

Att*_*ffy 16

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

assigns(:client).should be_a(Client)
assigns(:client).should be_new_record
Run Code Online (Sandbox Code Playgroud)

(出于历史原因,您不能使用[:client]分配:http://guides.rubyonrails.org/testing.html#the-four-hashes-of-the-apocalypse)


Epi*_*ene 15

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

expect(assigns(:client)).to be_a(Client)
Run Code Online (Sandbox Code Playgroud)

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

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

# spec assignment based on collection membership

expect(assigns.keys).to include('client')
Run Code Online (Sandbox Code Playgroud)

请参阅@AttilaGyörffy关于为什么必须使用字符串键访问分配哈希的答案.