RSpec Rails - 主题+指定为一个班轮?

时间:2018-05-06 11:15:54

标签: ruby-on-rails ruby rspec

我正在努力应对以下RSpec。为什么会这样:

   it 'GET articles#new creates new instance of Article' do
    get :new
    expect(assigns[:article]).to be_a(Article)
  end

这些都没有(发现一些带有不同括号的例子,这就是我决定检查两种可能性的原因)

  subject { get :new }
  it { expect(assigns[:article]).to be_a(Article) }
  it { expect(assigns(:article)).to be_a(Article) }

我收到此错误:

 Failure/Error: it { expect(assigns(:article)).to be_a(Article) }
   expected nil to be a kind of Article(id: integer, title: string, body: string, author_id: integer, created_at: datetime, updated_at: datetime)
 # ./spec/controllers/articles_controller_spec.rb:35:in `block (4 levels) in <top (required)>'

我不知道如何从主题中检索“文章”......

我也在其中尝试过“主题”和“分配”的各种组合{...},但我无法让它发挥作用。

我宁愿保持清洁,只将它存储在一行:)

顺便说一下:你还有其他为控制器编写规格的习惯吗? (我已经检查了回复200)

2 个答案:

答案 0 :(得分:0)

根据documentation,控制器规范:

  

允许您在每个示例中模拟单个http请求,然后   指定预期结果,例如:

     
      
  • 在控制器中分配的实例变量以与视图共享
  •   

这就是为什么你必须在get :new块内运行请求(如it)以返回正确的输出。

如果您将请求定义为规范的主题(关于subject here的精确度),则需要在it块中运行主题:

subject { get :new }

it 'GET articles#new creates new instance of Article' do
  subject
  expect(assigns[:article]).to be_a(Article)
end

答案 1 :(得分:0)

subject,与let一样,仅在您引用时才进行延迟评估。您可以改为使用subject!,这将在每个示例之前进行评估