2011-03-09 81 views
0


我可以通过运行我的代码部分通过RubyMine运行我的测试(右键单击到_spec.rb文件并运行)。但是,通过运行“rake spec”,我得到一个错误。表格被移除,并且不会在每次测试中重建。我知道这会让人感觉到,但如果它不再被重建,就不会有这种感觉。
之类的东西分贝:测试:负载,分贝:测试:准备,分贝:测试:clone_sturcture也不work.When我只是运行 “耙规格” 我得到这个错误:Rspec2 Rails3耙规格失败

C:\RubyStack\ruby\bin\ruby.exe -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) C:\RubyStack\ruby\bin\rake spec 
Testing started at 14:11 ... 
(in E:/idun/ComServer_v0.0/source) 
C:/RubyStack/ruby/bin/ruby.exe -S bundle exec rspec ./spec/controllers/customer_controller_spec.rb 
Empty test suite. 

ActiveRecord::StatementInvalid: Mysql2::Error: Table 'comserver_test.customers' doesn't exist: DELETE FROM `customers` 
C:/RubyStack/ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:207:in `rescue in log' 
C:/RubyStack/ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:199:in `log' 
C:/RubyStack/ruby/lib/ruby/gems/1.9.1/gems/mysql2-0.2.6-x86-mingw32/lib/active_record/connection_adapters/mysql2_adapter.rb:314:in `execute' 
C:/RubyStack/ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.5/lib/active_record/connection_adapters/abstract/database_statements.rb:288:in `update_sql' 
C:/RubyStack/ruby/lib/ruby/gems/1.9.1/gems/mysql2-0.2.6-x86-mingw32/lib/active_record/connection_adapters/mysql2_adapter.rb:331:in `update_sql' 
C:/RubyStack/ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.5/lib/active_record/connection_adapters/abstract/database_statements.rb:293:in `delete_sql' 
C:/RubyStack/ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.5/lib/active_record/connection_adapters/abstract/database_statements.rb:54:in `delete' 
C:/RubyStack/ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.5/lib/active_record/connection_adapters/abstract/query_cache.rb:16:in `delete' 
C:/RubyStack/ruby/lib/ruby/gems/1.9.1/gems/arel-2.0.9/lib/arel/crud.rb:34:in `delete' 
C:/RubyStack/ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.5/lib/active_record/relation.rb:273:in `delete_all' 
C:in `delete_all' 
E:/idun/ComServer_v0.0/source/spec/controllers/customer_controller_spec.rb:20:in `block (2 levels) in <top (required)>' 
C:/RubyStack/ruby/lib/ruby/gems/1.9.1/gems/rspec-core-2.5.1/lib/rspec/core/hooks.rb:29:in `instance_eval' 

* _spec。 rb:

require 'spec_helper' 
require 'customer' 
require 'rack/test' 
require 'rspec' 
require 'logger' 

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

def app 
    Rails::Application 
end 

describe "customers" do 

    render_views 

    before(:each) do 
    Customer.delete_all 
    end 

    describe "GET on /customers/:id" do 
    before(:each) do 
     Customer.create(
     :gmsid => 1, 
     :online => true, 
     :pinged_at => DateTime.now 
    ) 
    end 

    it "should return a customer by id" do 
     @response = get("/customers/1") 
     @response.status.should eq(200) 
     attributes = ActiveSupport::JSON.decode(@response.body) 
     attributes['customer']["online"].should be_true 
    end 

    it "should return \"null\" if customer not found" do 
     @response = get('/customers/2') 
     @response.body.to_s.should eq("null") 
    end 
    end 

    describe "should POST on /customers" do 
    it "should create a user" do 
     customer = Customer.new(
     :gmsid => 2, 
     :online => false, 
     :pinged_at => DateTime.now 
    ) 
     puts customer 
     json = ActiveSupport::JSON.encode(customer) 
     @response = post('/customers', json) 
     @response.status.should eq(200) 
     @response = get('/customers/2') 
     attributes = ActiveSupport::JSON.decode(@response.body) 
     attributes['customer']['gmsid'].should eq(2) 
     attributes['customer']['online'].should be_false 
    end 
    end 

    describe "should PUT on /customers/:id" do 
    before(:each) do 
     Customer.create(
     :gmsid => 1, 
     :online => false, 
     :pinged_at => DateTime.now 
    ) 
    end 

    it "should update a user to status true" do 
     @response = put('/customers/1', ActiveSupport::JSON.encode(Customer.new(
      :online => true 
    ))) 
     @response.status.should eq(200) 
     @response = get('/customers/1') 
     attributes = ActiveSupport::JSON.decode(@response.body) 
     attributes['customer']['online'].should be_true 

    end 

    it "when user doesn't exist should return null" do 
     @response = put('/customers/2', ActiveSupport::JSON.encode(Customer.new(
      :online => true 
    ))) 
     @response.status.should eq(200) 
     @response.body.to_s.should eq("null") 
    end 
    end 

    describe "should DELETE on /customers/:id" do 
    it "should delete a existing user" do 
     Customer.create(
      :gmsid => 1, 
      :online => true, 
      :pinged_at => DateTime.now 
    ) 
     @response = get('/customers/1') 
     #test if customer with gmsid 1 is in database 
     @response.status.should eq(200) 
     attributes = ActiveSupport::JSON.decode(@response.body) 
     attributes['customer']['gmsid'].should eq(1) 
     #delete customer with gmsid 1 
     @response = delete ('/customers/1') 
     @response.status.should eq(200) 
     #check if customer with gmsid 1 is not in database anymore 
     @response = get ('/customers/1') 
     @response.status.should eq(200) 
     @response.body.to_s.should eq("null") 
    end 
    end 
end 
+0

我认为这是db:test:通过做“rake spec”来准备哪些是invoket。如果我手动运行它,它只会破坏我的桌子!? – 2011-03-10 14:02:14

回答

0

好的,我解决了这个问题。

这是讨论here的“libmysql.dll问题”。

问题是mysql 5.0版本。它应该高于5.1。所以,我只是将“libmysql.dll”更改为新版本的mysql版本。有效。 您需要这样才能从您的开发环境(db:schema:dump)创建适当的转储。
该命令在您的项目中创建一个schema.rb。
该模式由“db:test:prepare”使用,在测试之前每次执行“rake spec”时都会调用该模式。这个schema.rb是空的,所以没有创建表。 听起来对我来说很合理。

如果我错了,请纠正我。