2013-03-09 31 views
0

我正在与本书面向服务的设计与Ruby和Rails。在第一章中,它使用活动记录创建了一个Sinatra应用程序的服务。我创建了活动记录迁移(001_create_users.rb,见下文),并运行rake文件进行迁移(使用命令rake db:migrate),并且它给了我看似表明用户表已创建的输出(请参阅此底部运行rake db:migrate后输出)。但是,当我运行规格(rspec spec/service_spec.rb,请参阅下文)时,它给了我一个错误,说它无法找到用户表。迁移后没有用户表

table_structure': Could not find table 'users' (ActiveRecord::StatementInvalid) 

你能告诉我,我可能是做错了?这本书的第一章的源代码也可以在这里找到https://github.com/pauldix/service-oriented-design-with-ruby/tree/master/chapter_01

规格/ service_spec.rb

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

def app 
    Sinatra::Application 
end 

describe "service" do 
    before(:each) do 
    User.delete_all 
    end 

    describe "GET on /api/v1/users/:id" do 
    before(:each) do 
     User.create(
     :name => "paul", 
     :email => "[email protected]", 
     :password => "strongpass", 
     :bio => "rubyist") 
    end 

    it "should return a user by name" do 
     get '/api/v1/users/paul' 
     last_response.should be_ok 
     attributes = JSON.parse(last_response.body)["user"] 
     attributes["name"].should == "paul" 
    end 

/db/migrate/001_create_users.rb

class CreateUsers < ActiveRecord::Migration 
    def self.up 
    create_table :users do |t| 
     t.string :name 
     t.string :email 
     t.string :password 
     t.string :bio 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :users 
    end 
end 

耙文件

require 'rubygems' 
require 'active_record' 
require 'yaml' 
require 'logger' 

desc "Load the environment" 
task :environment do 
    env = ENV["SINATRA_ENV"] || "development" 
    databases = YAML.load_file("config/database.yml") 
    ActiveRecord::Base.establish_connection(databases[env]) 
end 

namespace :db do 
    desc "Migrate the database" 
    task(:migrate => :environment) do 
    ActiveRecord::Base.logger = Logger.new(STDOUT) 
    ActiveRecord::Migration.verbose = true 
    ActiveRecord::Migrator.migrate("db/migrate") 
    end 
end 

运行耙分贝后:迁移

D, [2013-03-08T20:11:55.490937 #3824] DEBUG -- : (0.2ms) select sqlite_version(*) 
D, [2013-03-08T20:11:55.493906 #3824] DEBUG -- : (2.1ms) CREATE TABLE "schema_migrations" ("version" varchar(255) NOT NULL) 
D, [2013-03-08T20:11:55.497176 #3824] DEBUG -- : (2.6ms) CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version") 
D, [2013-03-08T20:11:55.544128 #3824] DEBUG -- : (44.9ms) SELECT "schema_migrations"."version" FROM "schema_migrations" 
I, [2013-03-08T20:11:55.544615 #3824] INFO -- : Migrating to CreateUsers (1) 
D, [2013-03-08T20:11:55.545263 #3824] DEBUG -- : (0.1ms) begin transaction 
== CreateUsers: migrating ==================================================== 
-- create_table(:users) 
D, [2013-03-08T20:11:55.570509 #3824] DEBUG -- : (0.6ms) CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "email" varchar(255), "password" varchar(255), "bio" varchar(255), "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL) 
    -> 0.0018s 
== CreateUsers: migrated (0.0019s) =========================================== 

D, [2013-03-08T20:11:55.571113 #3824] DEBUG -- : (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('1') 
D, [2013-03-08T20:11:55.576187 #3824] DEBUG -- : (4.8ms) commit transaction 
michael$ rspec spec/service_spec.rb 
D, [2013-03-08T20:12:57.812685 #3854] DEBUG -- : env: test 
D, [2013-03-08T20:12:57.910829 #3854] DEBUG -- : db/test.sqlite3 database connection established... 
+1

通常测试数据库不同于您的开发数据库。确保你创建了你的测试数据库 – 2013-03-09 04:50:31

回答

0

migrate任务调用environment为前提,其设置默认的环境,“发展”,除非有一个变量ENV说别的东西。

发生什么事是你的开发数据库被迁移,但不是你的测试数据库。

喜欢你的书的说明说,过了一会儿,叫

rake db:migrate SINATRA_ENV=test 

,它会成为你测试 DB被迁移。

+0

本书的这个版本并没有这么说(至少不是我能看到的),但是谢谢 – BrainLikeADullPencil 2013-03-09 06:12:28

+0

https://github.com/pauldix/service-oriented-design-with-ruby/blob/master/chapter_01/README#L35 – 2013-03-09 15:29:40

+0

另一种选择是'RACK_ENV = test rake db:migrate' – equivalent8 2014-12-10 09:37:38

相关问题