首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rspec2 Rails3 rake规范失败

Rspec2 Rails3 rake规范失败
EN

Stack Overflow用户
提问于 2011-03-09 16:01:52
回答 1查看 623关注 0票数 0

我可以通过RubyMine运行部分代码来运行我的测试(右键进入_spec.rb文件并运行)。但是,通过运行"rake spec“我得到了一个错误。在每次测试之前,该表将被删除,并且不会重新构建。我知道这是有道理的,但如果不重建的话就不会了。

像db:test:load,db:test:prepare,db:test:clone_sturcture get work.When我只是运行"rake spec“,我得到了这个错误:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-10 23:01:38

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

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

问题出在mysql 5.0版本。它应该高于5.1。因此,我刚刚将"libmysql.dll“更改为来自较新版本的mysql。啊,真灵。您需要它来从您的开发环境创建正确的转储(db:schema: dump )。

此命令在您的项目中创建一个schema.rb。

此模式由"db:test:prepare“使用,在测试之前,每次执行"rake spec”时都会调用该模式。此schema.rb为空,因此未创建任何表。在我看来这是逻辑上的。

如果我说错了,请纠正我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5242888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档