如何将RSpec Rails控制器测试放在不同的目录中?

时间:2011-12-05 14:53:50

标签: ruby-on-rails ruby ruby-on-rails-3 rspec rspec-rails

我想将一些集成测试放在与控制器单元规格不同的目录中。但是,当我将spec文件移动到spec / integration时,它会失败:

ArgumentError:
       bad argument(expected URI object or URI string)

spec在spec / controllers目录中正确传递。

以下是我的规格:

require 'spec_helper'

describe Users::LoginsController, type: :controller do
  let!(:user) { User.create(email: 'test@test.com', password: 'test')

  it 'logs in the user' do
    post :create, email: 'test@test.com', password: 'test'
    controller.current_user.should == user
  end
end

我正在使用Rails 3.1.3,RSpec 2.7.0。

我必须使用任何技巧来实现这一目标吗?

6 个答案:

答案 0 :(得分:2)

尝试指定类型:

describe ProductsController, type: :controller do
  it 'can test #show' do
    get :show
  end
end

适用于Rails 3.2.11

答案 1 :(得分:0)

您必须执行以下操作:

describe Users::LoginsController do
  controller_name 'users/logins'

  ... the rest of your spec here ...

end

我不完全确定嵌套语法,但至少需要指定controller_name才能使其正常工作。

希望这会有所帮助。

答案 2 :(得分:0)

如果使用符号指定测试操作,则测试框架不喜欢它。

it 'logs in the user' do
    post :create, email: 'test@test.com', password: 'test'
    controller.current_user.should == user
end

变为

it 'logs in the user' do
    post 'create', email: 'test@test.com', password: 'test'
    controller.current_user.should == user
end

答案 3 :(得分:0)

这种方法适用于Rails 4和RSpec 2.14.7:

我的发现:

  1. 不要将目录命名为integration。我需要浏览RSpec或Rails的源代码,但它似乎对运行控制器规范有不利影响。也许有这种知识的人可以插手来证实这一点。
  2. 将其命名为集成以外的其他内容;在我的情况下,我尝试int,导致出现问题,直到我在#describe方法之后添加了“type :: controller”。
  3. 之后,我能够将所有慢速Rails规范移动到我的int目录中,允许我为所有解耦的快速规范创建一个unit目录。
  4. 如果这对你有用,请告诉我。

    顺便说一下,我正在跑步:

    1. Ruby 1.9.3
    2. Rails 4.0.2
    3. rspec-core 2.14.7
    4. rspec-rails 2.14.1
    5. 全部在Mac OS X上。

答案 4 :(得分:0)

我遇到了同样的问题,最终只使用了网址

get "/users"

它并不干净但完成工作。我无法获得其他建议。

答案 5 :(得分:-9)

立即抓住机会摆脱控制器和集成规格。他们写作不必要地痛苦,而且与实现相结合。用黄瓜故事替换它们。你的生活会更容易......