ruby-on-rails – 如何使用Rspec测试控制器 – #show动作

我有一个属于用户的批处理模型.用户应该只能看到自己的Batches实例.

对于索引操作,这是我做的:

批#指数

context "GET index" do

  it "should get only users batches" do
    FactoryGirl.create(:batch)
    batch = FactoryGirl.create(:batch)
    batch2 = FactoryGirl.create(:batch)            
    subject.current_user.batches << batch
    get "index"
    assigns(:batches).should == subject.current_user.batches
    assigns(:batches).should_not include(batch2) 
  end

end

对于创建动作,这是我做的:

批#创建

context "POST create" do

  it "should save a users batch into current_user" do
    batch = subject.current_user.batches.build(name: 'bla')
    put :create,batch
    subject.current_user.batches.should include(batch)
  end

  it "should save a batch from other user into current_user" do
    batch = subject.current_user.batches.build(name: 'bla')
    batch2 = FactoryGirl.create(:batch)
    put :create,batch
    subject.current_user.batches.should_not include(batch2)
  end

end

但是,我不确定如何在show动作中测试此行为.这是我正在做的事情:

批#秀

context "GET show/:id" do

  it "should show batches from user" do
    batch_params = FactoryGirl.build(:batch)
    batch = subject.current_user.batches.create(batch_params)
    get :show,id: batch.id
    response.should redirect_to(batch)
  end

  it "should not show batches from other users" do
    batch = subject.current_user.batches.create(name: 'bla')
    batch2 = FactoryGirl.create(:batch)
    get :show,id: batch2.id
    response.should redirect_to(:batches)
  end

end

我遇到了以下失败:

Failures:

  1) BatchesController GET show/:id should not show batches from other users
     Failure/Error: response.should redirect_to(:batches)
       Expected response to be a <:redirect>,but was <200>
     # ./spec/controllers/batches_controller_spec.rb:66:in `block (3 levels) in <top (required)>'

  2) BatchesController GET show/:id should show batches from user
     Failure/Error: batch = subject.current_user.batches.create(batch_params)
     NoMethodError:
       undefined method `stringify_keys' for #<Batch:0x00000005d0ef80>
     # ./spec/controllers/batches_controller_spec.rb:58:in `block (3 levels) in <top (required)>'

我究竟做错了什么?我该如何测试视图操作的这种行为?

解决方法

第一次失败,“不应该显示来自其他用户的批次”,看起来它可能反映了控制器中的实际问题.您是否也在浏览器中对此进行了测试以确认问题是在您的测试中而不是在实际代码中?

在另一个测试中,我不太确定问题究竟是什么,但我可能会像这样构建批处理:

batch = FactoryGirl.create(:batch,user: subject.current_user)

尝试一下,看看它是否解决了.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...