rspec - 无法使用RSpec 2和Edge Rails 3进行 Controller 测试

标签 rspec ruby-on-rails-3

不知道这是Rails 3还是RSpec 2,但是我似乎无法使标准 Controller 测试正常-似乎找不到'get'方法。

我有一个看起来像这样的 Controller 测试(在discrepancies_controller_spec.rb目录中名为spec/controllers):

require 'spec_helper'

describe DiscrepanciesController do
  before :each do
    Discrepancy.delete_all
  end

  it "resolves a discrepancy" do
 discrepancy = Discrepancy.create(:my_number=>"12345", :status=>"Open")

 get :resolve, :id => discrepancy.id

 retrieved_discrepancy = Discrepancy.find_by_my_number("12345")
 retrieved_discrepancy.status.should == "Resolved"
  end
end

(是的,我知道使用HTTP/GET修改数据的安全性-这是一个单独的问题...)

当我用rake运行它时,出现以下错误:
1) DiscrepanciesController resolves a discrepanc
    Failure/Error: Unable to find C to read failed line
    undefined method `get' for #<RSpec::Core::ExampleGroup::Nested_1:0xc9170d0 @__memoized={}>
    # ./spec/controllers/discrepancies_controller_spec.rb:38 (ignore the line number, commented out code was removed from the sample)
    # C:/Users/Patrick_Gannon/.bundle/ruby/1.8/bundler/gems/rails-16a5e918a06649ffac24fd5873b875daf66212ad-master/activesupport/lib/active_support/dependencies.rb:212:in `inject'
    # C:/Ruby187/bin/rake:19:in `load'
    # C:/Ruby187/bin/rake:19

我可以通过自己实例化 Controller 并直接调用 Controller Action 来测试 Controller Action ,它可以工作,但是很难看,因为我必须模拟出respond_toparams之类的东西。

其他相关信息:我正在运行Windows 7 32位,Ruby 1.8.7(2010-01-10补丁程序级别249)[i386-wingw32],Edge Rails 3和MongoDB/MongoMapper。这是我已安装的 gem 列表(通过“bundle gem”-我所有已安装的 gem 均由Bundler安装)
  • 摘要(1.0.0)
  • actionmailer(3.0.0.beta4)
  • actionpack(3.0.0.beta4)
  • activemodel(3.0.0.beta4)
  • activerecord(3.0.0.beta4)
  • activeresource(3.0.0.beta4)
  • activesupport(3.0.0.beta4)
  • arel(0.4.0)
  • bcrypt-ruby(2.1.2)
  • bson(1.0.3)
  • bson_ext(1.0.1)
  • 构建器(2.1.2)
  • 捆绑器(0.9.26)
  • capistrano(2.5.19)
  • capybara (0.3.8 a94f99)
  • cucumber (0.8.3)
  • cucumber 导轨(0.3.2 master-b75110)
  • 文明(0.2.10)
  • database_cleaner(0.5.2 7ea99d)
  • devise(1.1.rc1 88ab2f)
  • diff-lcs(1.1.2)
  • erubis(2.6.5)
  • factory_girl(1.3.0)
  • factory_girl_rails(1.0)
  • 伪造者(0.3.1)
  • ffi(0.6.3)
  • 小 cucumber (2.0.2)
  • 高线(1.5.2)
  • i18n(0.4.1)
  • jnunemaker-validatable(1.8.4)
  • 联合(0.3.2 11a094)
  • json_pure(1.4.3)
  • 邮件(2.2.5)
  • mime-types(1.16)
  • mongo(1.0.3)
  • mongo_mapper(0.8.2)
  • net-scp(1.0.2)
  • net-sftp(2.0.4)
  • net-ssh(2.0.23)
  • net-ssh网关(1.0.1)
  • nokogiri(1.4.2.1)
  • plucky(0.3.2)
  • 多语言(0.3.1)
  • 机架(1.1.0)
  • 机架安装(0.6.6)
  • 机架测试(0.5.4)
  • rails(3.0.0.beta4 6682cc)
  • Railties(3.0.0.beta4)
  • 耙(0.8.7)
  • rspec(2.0.0.beta.13)
  • rspec核心(2.0.0.beta.13)
  • rspec期望(2.0.0.beta.13)
  • rspec-mocks(2.0.0.beta.13)
  • rspec-rails(2.0.0.beta.13)
  • selenium-webdriver(0.0.24)
  • term-ansicolor(1.0.5)
  • 雷神(0.13.6)
  • treetop (1.4.8)
  • trollop(1.16.2)
  • tzinfo(0.3.22)
  • 魔杖(0.2.1)
  • 管理员(0.10.7)
  • Webrat(0.7.1)

  • 我还在测试中添加了puts语句,以显示测试治具((methods - Object.methods).sort.inspect)中可用的方法,并且“get”不在列表中。这是列表中的内容:
    "__memoized", "__should_for_example_group__", "__should_not_for_example_group__", "_fixture_class_names", "_fixture_path", "_fixture_table_names", "_pre_loaded_fixtures", "_setup_mocks", "_teardown_mocks", "_use_instantiated_fixtures", "_use_transactional_fixtures", "_verify_mocks", "a_kind_of", "allow_message_expectations_on_nil", "an_instance_of", "any_args", "anything", "assert", "assert_block", "assert_equal", "assert_in_delta", "assert_instance_of", "assert_kind_of", "assert_match", "assert_nil", "assert_no_match", "assert_not_equal", "assert_not_nil", 
    "assert_not_same", "assert_nothing_raised", "assert_nothing_thrown", "assert_operator", "assert_raise", "assert_raises", "assert_respond_to", "assert_same", "assert_send", "assert_throws", "be", "be_a", "be_a_kind_of", "be_a_new", "be_an", "be_an_instance_of", "be_close", "be_false", "be_instance_of", "be_kind_of", "be_nil", "be_true", "boolean", "build_message", "change", "described_class", "double", "duck_type", "eq", "eql", "equal", "example", "example=", "exist", "expect", "fixture_class_names", "fixture_class_names?", "fixture_path", "fixture_path?", "fixture_table_names", 
    "fixture_table_names?", "flunk", "hash_including", "hash_not_including", "have", "have_at_least", "have_at_most", "have_exactly", "include", "instance_of", "kind_of", "match", "method_missing", "method_name", "mock", "mock_discrepancy", "mock_model", "no_args", "pending", "pre_loaded_fixtures", "pre_loaded_fixtures?", "raise_error", "respond_to", "run_in_transaction?", "running_example", "satisfy", "setup_fixtures", "stub_model", "subject", "teardown_fixtures", "throw_symbol", "use_instantiated_fixtures", "use_instantiated_fixtures?", "use_transactional_fixtures", "use_transactional_fixtures?"
    

    最佳答案

    可以从David Chelimsky的RSpec邮件列表中获得有关此问题的答案,如下所示:

    我很惊讶这是它第一次提出rspec-2,但是我们在这里:)

    这是一个路径分隔符错误,我将在下一版本中解决。现在,您可以在 Controller 规范中执行此操作:

    describe DiscrepanciesController do
      include RSpec::Rails::ControllerExampleGroup
    

    那应该工作正常。

    如果要执行更全局的解决方法,请将其添加到您的spec_helper配置中:
    RSpec.configure do |c|
      c.include RSpec::Rails::ControllerExampleGroup, :example_group => { :file_path => /\bspec[\\\/]controllers[\\\/]/ }
    end
    

    关于rspec - 无法使用RSpec 2和Edge Rails 3进行 Controller 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3121927/

    相关文章:

    ruby - 使用 Sinatra 和 rspec stub Controller 方法

    ruby-on-rails - 使用 zeus : Postgres is being accessed by other users 进行 cucumber 和 RSpec 测试

    css - 覆盖 Bootstrap float 和 margin

    ruby-on-rails - Ruby on Rails - 电子邮件确认链接给出 nomethoderror

    ruby-on-rails - karma + rails : File structure?

    ruby-on-rails - Rails I18n 通过数据库专栏

    ruby-on-rails - 如何 stub 事件记录关系以使用 rspec 测试 where 子句?

    ruby-on-rails - 在 Rails/Capybara/Poltergeist 规范中使用 url_for 将驱动程序发送到 example.com 而不是应用程序

    ruby-on-rails - 使用RSpec测试Rails辅助方法时,如何在params哈希中设置值?

    ruby-on-rails-3 - 使用 MongoID 在 Rails 中进行标记的良好解决方案