我做错了什么?运行rspec时我不断收到此错误:
故障:
1)AccountsController POST:创建一个已存在的帐户呈现:new模板 失败/错误:期望(响应).to render_template(:new) 期待<“new”>但使用< []> 进行渲染 #./spec/controllers/accounts_controller_spec.rb:131:in块中的“块(4级)”
以0.26832秒结束 34个例子,1个失败
失败的例子:
rspec ./spec/controllers/accounts_controller_spec.rb:128#AccountsController POST:创建一个已经存在的帐户呈现:新模板
我通过在rails控制台中运行它来验证我的代码是否正确编写。而且确实如此,它呈现:new模板甚至返回200.我通过在rails控制台中使用app对象来实现这一点。输出如下:
Started POST "/accounts" for 127.0.0.1 at 2014-03-26 21:18:06 -0700
Processing by AccountsController#create as HTML
Parameters: {"account"=>{"name"=>"name", "description"=>"desc", "opening_balance"=>"1.0"}}
(0.1ms) begin transaction
Account Exists (0.2ms) SELECT 1 AS one FROM "accounts" WHERE "accounts"."name" = 'name' LIMIT 1
[deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set I18n.enforce_available_locales = false to avoid this message.
(0.1ms) rollback transaction
**Rendered accounts/new.html.erb within layouts/application (1.4ms)**
Completed 200 OK in 44ms (Views: 32.8ms | ActiveRecord: 0.3ms)
=> 200
这会创建两次相同的帐户。我希望,它会失败,然后重定向到:新模板。 rspec代码在这里:
context 'an account that already exists' do
it 'renders the :new template' do
call_post_create_verb
call_post_create_verb
**expect(response).to render_template(:new)**
end
end
查看else条件,你会找到我渲染的地方:new。控制器代码在这里:
def ceate
@account = Account.new(account_params)
if @account.save
redirect_to @account
else
**render :new**
end
end
这是我的设置: ruby 2.1.1p76(2014-02-24修订版45161)[x86_64-darwin13.0] 铁轨(4.0.3) rspec-rails(2.14.1)
答案 0 :(得分:1)
let(:call_post_create_verb) { post :create, account: valid_info }
最初模拟两次创建同一个帐户,我只是简单地调用了两次。它应该工作,但它拒绝。因此,我没有将其调用两次,而是将第一个调用更改为:
Account.create valid_info
所以我首先在模型中创建它,然后调用'post create'来创建一个具有相同信息的帐户,这肯定会失败,因为我正在验证name属性中的唯一性。
这样做之后,它终于奏效了。
答案 1 :(得分:0)
我认为您需要在规范中添加render_views
。 RSpec默认不提供任何内容 - 这就是为什么你得到"期待<" new">但使用< []>"
context 'an account that already exists' do
render_views
it 'renders the :new template' do
call_post_create_verb
call_post_create_verb
**expect(response).to render_template(:new)**
end
结束