【发布时间】: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