简体   繁体   English

如何使用Rspec测试控制器 - #show动作

[英]How to test controller with Rspec - #show action

I have a Batch model that belongs_to a User. 我有一个belongs_to用户的批处理模型。 User should only see their own Batches instances. 用户应该只能看到自己的Batches实例。

For the index action, here is what I did: 对于index操作,这是我做的:

Batch#index

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

For the create action, here is what I did: 对于create动作,这是我做的:

Batch#create

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

However, I'm not sure how to test this behaviour in the show action. 但是,我不确定如何在show动作中测试此行为。 Here is what I'm doing: 这是我正在做的事情:

Batch#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

I'm getting the following failures: 我遇到了以下失败:

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)>'

What am I doing wrong? 我究竟做错了什么? How should I test this behaviour of view action? 我该如何测试view操作的这种行为?

get :show, id: batch.id

将不会重定向它将呈现显示,因此响应代码200,您可以检查

response.should render_template :show 

The first failure, "should not show batches from other users," looks like it might reflect an actual problem in your controller. 第一次失败,“不应该显示来自其他用户的批次”,看起来它可能反映了控制器中的实际问题。 Did you also test this in the browser to confirm the problem is in your test and not in the actual code? 您是否也在浏览器中对此进行了测试以确认问题是在您的测试中而不是在实际代码中?

On the other test, I'm not quite sure what the problem is exactly, but I would probably build the batch like this instead: 在另一个测试中,我不太确定问题究竟是什么,但我可能会像这样构建批处理:

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

Give that a try and see if it doesn't resolve it. 尝试一下,看看它是否解决了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM