我正在努力应对以下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)答案 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!
,这将在每个示例之前进行评估