【问题标题】:Rspec not recognizing tables in Sinatra appRspec 无法识别 Sinatra 应用程序中的表格
【发布时间】:2016-08-30 16:09:51
【问题描述】:

我正在创建一个需要自定义路由的轻量级应用程序,因此我使用 Sinatra over Rails。但是,我使用的是一个非常模仿 Rails 功能的骨架,而不必每次都与惯例作斗争。

问题是当我尝试运行 Rspec 时,它告诉我没有关系。我一直在想一定有一个多元化的问题,但就我而言,我找不到它。我并没有尝试做任何花哨的事情(还),只是能够做一些事情,这样我就可以在之后开始进行验证等。

代码示例:

问题

当我运行 bundle exec rspec 时:

  1) Admin successfully creates Admin
 Failure/Error: admin = Admin.new
 ActiveRecord::StatementInvalid:
   PG::UndefinedTable: ERROR:  relation "admins" does not exist
   LINE 5:                WHERE a.attrelid = '"admins"'::regclass
                                             ^
   :               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                        pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
                   FROM pg_attribute a LEFT JOIN pg_attrdef d
                     ON a.attrelid = d.adrelid AND a.attnum = d.adnum
                  WHERE a.attrelid = '"admins"'::regclass
                    AND a.attnum > 0 AND NOT a.attisdropped
                  ORDER BY a.attnum
 # ./spec/admin_spec.rb:6:in `block (2 levels) in <top (required)>'

但是在控制台手动运行:

irb(main):007:0> Admin.all.length
D, [2016-05-04T18:42:02.818958 #30608] DEBUG -- :   Admin Load (1.3ms)  SELECT "admins".* FROM "admins"
=> 0
irb(main):008:0> admin = Admin.new
=> #<Admin id: nil, name: nil, password: nil, created_at: nil, updated_at: nil>
irb(main):009:0> admin.save
D, [2016-05-04T18:42:15.127732 #30608] DEBUG -- :    (0.6ms)  BEGIN
D, [2016-05-04T18:42:15.140416 #30608] DEBUG -- :   SQL (1.1ms)  INSERT INTO "admins" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id"  [["created_at", "2016-05-05 01:42:15.130599"], ["updated_at", "2016-05-05 01:42:15.130599"]]
D, [2016-05-04T18:42:15.146401 #30608] DEBUG -- :    (2.3ms)  COMMIT
=> true
irb(main):010:0> Admin.all.length
D, [2016-05-04T18:42:28.236480 #30608] DEBUG -- :   Admin Load (2.1ms)  SELECT "admins".* FROM "admins"
=> 1

代码

模型:

class Admin < ActiveRecord::Base
  # Remember to create a migration!
end

迁移:

class CreateAdmins < ActiveRecord::Migration
  def change
    create_table :admins do |t|
      t.string :name
      t.string :password

      t.timestamps
    end
  end
end

规格:

require 'spec_helper'

describe Admin do

  it "successfully creates Admin" do
    admin = Admin.new
    expect(admin.save).to change{Admin.all.length}.by(1)
  end

end

规范助手:

require 'rubygems'

ENV['RACK_ENV'] ||= 'test'

require File.expand_path("../../config/environment", __FILE__)
require 'shoulda-matchers'
require 'rack/test'
require 'capybara'
require 'capybara/rspec'

RSpec.configure do |config|
  config.include Rack::Test::Methods
end

def app
  Sinatra::Application
end

Capybara.app = app.new

我希望这是足够的信息,这是我的第一个问题,告诉我你是否需要更多,或者如果更少会更好。谢谢!

我还看到了涉及特定于 Rails 的 rake 任务的解决方案。其中大部分在 Sinatra 中不存在,我无法找到源代码以将其放入我的 Sinatra 应用程序中。

【问题讨论】:

  • 我明白了: WHERE a.attrelid = '"admins"' 双引号应该是字符串的一部分吗?我认为不是,但我可能是错的。我认为应该是:WHERE a.attrelid = 'admins'
  • @KeithBennett 我同意,因为它有两组引号。我的问题是我不知道为什么要这样做。我以前见过它,但这总是意味着我忘记了迁移或复数错误。 :(

标签: ruby postgresql activerecord rspec sinatra


【解决方案1】:

rake db:migrate RACK_ENV=test

我不会撒谎,我尝试了六次。但它终于对下一个进入兔子洞的可怜灵魂奏效了......

【讨论】:

    【解决方案2】:

    那是因为 rspec 在测试环境中运行。您的应用似乎没有测试数据库。

    我在第一次运行您的代码时遇到了同样的问题

    [retgoat@iMac-Roman ~/temp/sinatra-activerecord-starter-kit]$ git:(master) be rspec
    .F
    
    Failures:
    
    1) Admin successfully creates Admin
     Failure/Error: admin = Admin.new
    
     ActiveRecord::StatementInvalid:
       PG::UndefinedTable: ERROR:  relation "admins" does not exist
       LINE 5:                WHERE a.attrelid = '"admins"'::regclass
                                                 ^
       :               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                            pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
                       FROM pg_attribute a LEFT JOIN pg_attrdef d
                         ON a.attrelid = d.adrelid AND a.attnum = d.adnum
                      WHERE a.attrelid = '"admins"'::regclass
                        AND a.attnum > 0 AND NOT a.attisdropped
                      ORDER BY a.attnum
    
    Finished in 0.09315 seconds (files took 1.28 seconds to load)
    2 examples, 1 failure
    

    然后我创建了测试数据库

    [retgoat@iMac-Roman ~/temp/sinatra-activerecord-starter-kit]$ git:(master) ENV=test rake db:setup
    sinatra_development already exists
    sinatra_test already exists
    -- enable_extension("plpgsql")
       -> 0.0100s
    -- create_table("admins", {:force=>:cascade})
       -> 0.0109s
    -- initialize_schema_migrations_table()
       -> 0.0016s
    -- enable_extension("plpgsql")
       -> 0.0104s
    -- create_table("admins", {:force=>:cascade})
       -> 0.0186s
    -- initialize_schema_migrations_table()
       -> 0.0046s
    

    并且稍微改变了你的测试:你应该在expect {}.to change 中使用一个块,而不仅仅是前缀。 因为它会失败

      1) Admin successfully creates Admin
         Failure/Error: expect(admin.save).to change{Admin.all.length}.by(1)
           expected result to have changed by 1, but was not given a block
         # ./spec/models/admin_spec.rb:5:in `block (2 levels) in <top (required)>'
    

    所以只需用块替换括号

    describe Admin do
    
      it "successfully creates Admin" do
        admin = Admin.new
        expect { admin.save }.to change{Admin.all.length}.by(1)
      end
    
    end
    

    测试通过

    [retgoat@iMac-Roman ~/temp/sinatra-activerecord-starter-kit]$ git:(master) be rspec
    D, [2016-05-05T08:52:22.200133 #16356] DEBUG -- :   Admin Load (0.1ms)  SELECT "admins".* FROM "admins"
    .
    
    Finished in 0.03326 seconds (files took 0.77676 seconds to load)
    2 examples, 0 failures
    

    【讨论】:

    • 我更改了测试,并尝试了您的其他建议。环境是在一个助手中设置的,所以我在上面进行了编辑以包含它。 db 的 rake 任务触发了两个环境(开发和测试),所以就在那里。但是,我确实尝试过手动测试(上面的 ENV 和助手中的 RACK_ENV),它仍然给出了同样的错误。感谢您对 re: rspec 的建议。当我看了看之前的测试以确保我记得时,我一定是看错了。
    • 能否提供ActiveRecord::Base.establish_connection ENV['RACK_ENV'] 的输出? Ofc 在测试环境中运行时。
    • 另外,请提供您的spec_helper.rb
    猜你喜欢
    • 2012-11-27
    • 1970-01-01
    • 2017-07-28
    • 2021-04-07
    • 2019-07-22
    • 2012-09-05
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多