【问题标题】:using rspec to test a controller in a gem使用 rspec 测试 gem 中的控制器
【发布时间】:2013-06-21 14:57:23
【问题描述】:

有谁知道如何使用带有 rspec 的 gem 在应用程序中测试 gem 的控制器?我试过http://codingdaily.wordpress.com/2011/01/14/test-a-gem-with-the-rails-3-stack/http://say26.com/rspec-testing-controllers-outside-of-a-rails-application 都没有成功。

我在这样的 gem 中有一个控制器:

module mygem
 class PostsController < ::ApplicationController
  def index
    @posts = Posts.find(:all)
    @other_var = 10        
  end
 end
end

我想在我的应用中进行测试,例如 spec/controllers/posts_controller_spec.rb

describe PostsController do
  describe "index" do

    it "has posts" do
      get :index
      assigns(:posts).should_not be_nil
    end

    it "has other var" do
      get :index
      assert_equal(10, assigns(:other_var))
    end

  end
end

还有我的 spec_helper.rb

# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'

require File.expand_path("../../config/environment", __FILE__)    
require 'rspec/rails'
require 'rspec/autorun'

# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

RSpec.configure do |config|

end

我知道 rspec 并不是真的为此而生,想法或替代方案也会有所帮助。

【问题讨论】:

  • 你试过this question的答案了吗?
  • 我的应用中没有像这样的 gem 控制器的路径。
  • 您是否考虑过让您的 gem 成为 Rails 引擎?听起来它会更合适,因为通常宝石不包括控制器。 edgeguides.rubyonrails.org/engines.html

标签: ruby-on-rails testing rspec


【解决方案1】:

宝石就是宝石,应用程序就是应用程序。它们是不同的东西。

我认为将 gem 的测试混合到应用程序中并不是一个好习惯。

通常您不需要测试 gem,因为它们通常都经过了很好的测试。如果你真的想这样做或者 gem 缺乏测试,fork gem 并将它拉到本地,然后打开它的测试文件并添加你的。然后您可以将其推回以改进此 gem 或最终生成您自己的 gem 版本。

如果您正在编写自己的 gem,请将测试放入 gem 而不是 app。

如果你想测试 gem 添加到你的应用中的一些功能,你可以测试集成效果,但不需要单元测试。

【讨论】:

  • 我同意这一点,但一个问题是应用程序有初始化程序和设置 gem 需要运行,所以我不能完全自己测试 gem,而且我的老板也不会让我是这样做的,这确实是正确的方法。哈。
  • 不,你可以。 gem 必须与 app 分开,否则它不是 gem,而是 app 的一部分。如果这是您的 gem,并且需要一个应用程序进行测试,您可以在 gem 中创建一个演示应用程序。
  • 如果您想测试某些功能怎么办?假设我有 devise_token_auth 并测试我的模型是否可以正常使用。
  • @BillyChan 您是否知道任何有演示应用程序的宝石?我的 gem 需要开发人员更新 ActiveModel、控制器和视图,所以我必须在我的 gem 中测试 rails 功能。
【解决方案2】:

好吧,我现在感觉很笨,我只需要将 gem 命名空间添加到控制器中。所以

describe PostsController do
...
end

变成

describe mygem::PostsController do
...
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多