【问题标题】:How can I put RSpec Rails Controller tests in a different directory?如何将 RSpec Rails Controller 测试放在不同的目录中?
【发布时间】:2011-12-05 14:53:50
【问题描述】:

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

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

在 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。

我有什么技巧可以达到这个目的吗?

【问题讨论】:

  • 忘记复制了,修复了帖子。

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


【解决方案1】:

尝试指定类型:

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

在 Rails 3.2.11 中工作

【讨论】:

  • 它也适用于 Rails 2.3.18 和 RSpec 1.3.2,但使用以下语法:describe ProductsController, :type => :controller do
【解决方案2】:

您必须执行以下操作:

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

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

end

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

希望这会有所帮助。

【讨论】:

  • 似乎是正确的想法,但似乎该方法已被弃用。 :(
【解决方案3】:

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

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

【讨论】:

  • FWIW 我无法让 RSpec 2 与不同目录中的控制器一起工作。我认为正确的方法是使用标记 - relishapp.com/rspec/rspec-core/v/2-10/docs/command-line/…
  • 我在描述级别标记 - “描述 FooController,模式:集成做” - 然后 rspec --tags mode:integration / ~mode:integration。没有正确的值,是任意的。
【解决方案4】:

我遇到了同样的问题,最后只是使用了 URL

get "/users"

它不是那么干净,但可以完成工作。我无法让其他建议发挥作用。

【讨论】:

    【解决方案5】:

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

    我的发现:

    1. 不要将您的目录命名为integration。我需要通过 RSpec 或 Rails 的源进行 grep,但它似乎对运行控制器规范有不利影响。也许有这方面知识的人可以插话来证实这一点。
    2. 将其命名为集成以外的名称;就我而言,我尝试了int,这导致了问题直到我在#describe 方法之后添加了“type: :controller”。
    3. 之后,我能够将所有慢速 Rails 规范移动到我的 int 目录中,允许我为所有解耦的快速规范创建一个 unit 目录。

    如果这对你有用,请告诉我。

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

    1. Ruby 1.9.3
    2. Rails 4.0.2
    3. rspec-core 2.14.7
    4. rspec-rails 2.14.1

    全部在 Mac OS X 上。

    【讨论】:

      【解决方案6】:

      现在就抓住机会摆脱您的控制器和集成规范。它们编写起来不必要地痛苦,并且与实现过于耦合。用黄瓜故事代替它们。你的生活会轻松很多...

      【讨论】:

      • 其实我不是很喜欢 Cucumber。我没有任何理由不应该这样做。对我来说,测试控制器和模型之间的集成似乎是值得的。
      • 这样做是值得的——但 RSpec 是错误的工具。学会使用 Cucumber,而不是讨厌它。
      • 无助于回答这个问题,而且在我看来过于固执己见。 Cucumber 不是市场上唯一的工具...
      • 不,但它最适合这种情况。我试过其他的;没有什么比这更好的了。 RSpec 控制器测试专注于错误的事情。我有主见吗?绝对地。 Rails 也是如此。 RSpec 也是如此。
      • 只是说您的陈述作为评论可能会有所帮助,也就是“检查一下 - 对我有很大帮助”。但它没有资格作为答案,因为它没有解决@Ben 提到的最初问题。他是否应该调整数百个现有测试来解决他的问题?必须有一个更简单的解决方案...
      猜你喜欢
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      相关资源
      最近更新 更多