Rails:单元测试:ActiveRecord :: StatementInvalid:PG :: Error:ERROR:在列“created_at”中的空值。

3

你好,我目前正在尝试为我的用户通过一个简单的单元测试

require 'test_helper'

class UsersTest < ActiveSupport::TestCase
  test "user is created" do
    user = User.create!(:name => "Edmund")
    assert_equal user.id, User.first.id
  end
end

然而,当我运行rake test:units时,出现了一个错误:
1) Error:
test_user_is_created(UsersTest):
ActiveRecord::StatementInvalid: PG::Error: ERROR:  null value in column "created_at" violates not-null constraint
: INSERT INTO "messages" ("content", "read") VALUES ('MyText', 1)

(这是完整的日志)
Edmunds-MacBook-Pro:langexchange edmundmai$ rake test:units
NOTICE:  CREATE TABLE will create implicit sequence "languages_id_seq" for serial column "languages.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "languages_pkey" for table "languages"
NOTICE:  CREATE TABLE will create implicit sequence "locations_id_seq" for serial column "locations.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "locations_pkey" for table "locations"
NOTICE:  CREATE TABLE will create implicit sequence "messages_id_seq" for serial column "messages.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "messages_pkey" for table "messages"
NOTICE:  CREATE TABLE will create implicit sequence "users_id_seq" for serial column "users.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "users_pkey" for table "users"
Run options: 

# Running tests:

E

Finished tests in 0.666783s, 1.4997 tests/s, 0.0000 assertions/s.

  1) Error:
test_user_is_created(UsersTest):
ActiveRecord::StatementInvalid: PG::Error: ERROR:  null value in column "created_at" violates not-null constraint
: INSERT INTO "messages" ("content", "read") VALUES ('MyText', 1)
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/connection_adapters/postgresql_adapter.rb:654:in `async_exec'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/connection_adapters/postgresql_adapter.rb:654:in `block in execute'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activesupport-3.2.8/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/connection_adapters/postgresql_adapter.rb:653:in `execute'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/connection_adapters/abstract/database_statements.rb:277:in `insert_fixture'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/fixtures.rb:502:in `block (5 levels) in create_fixtures'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/fixtures.rb:501:in `each'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/fixtures.rb:501:in `block (4 levels) in create_fixtures'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/fixtures.rb:500:in `each'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/fixtures.rb:500:in `block (3 levels) in create_fixtures'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/fixtures.rb:492:in `each'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/fixtures.rb:492:in `block (2 levels) in create_fixtures'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/fixtures.rb:491:in `block in create_fixtures'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/connection_adapters/postgresql_adapter.rb:527:in `disable_referential_integrity'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/fixtures.rb:476:in `create_fixtures'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/fixtures.rb:895:in `load_fixtures'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/fixtures.rb:849:in `setup_fixtures'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activesupport-3.2.8/lib/active_support/callbacks.rb:407:in `_run__1860443591909891061__setup__836517370287596446__callbacks'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activesupport-3.2.8/lib/active_support/callbacks.rb:405:in `__run_callback'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activesupport-3.2.8/lib/active_support/callbacks.rb:385:in `_run_setup_callbacks'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activesupport-3.2.8/lib/active_support/callbacks.rb:81:in `run_callbacks'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activesupport-3.2.8/lib/active_support/testing/setup_and_teardown.rb:35:in `run'

1 tests, 0 assertions, 0 failures, 1 errors, 0 skips
rake aborted!
Command failed with status (1): [ruby -I"lib:test" -I"/Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/rake-10.0.2/lib" "/Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/rake-10.0.2/lib/rake/rake_test_loader.rb" "test/unit/**/*_test.rb" ]
Tasks: TOP => test:units
(See full trace by running task with --trace)

我的模型如下:

class Users < ActiveRecord::Base
  attr_accessible :age, :gender, :name

  has_many :sent_messages, :class_name => "Messages", :foreign_key => 'sender_id'
  has_many :received_messages, :class_name => "Messages", :foreign_key => 'receiver_id'

  belongs_to :location
  belongs_to :language

  before_save { |user| if user.new_record? then create_remember_token end }


    private

        def create_remember_token
            self.remember_token = SecureRandom.urlsafe_base64
        end

end


class Messages < ActiveRecord::Base
  attr_accessible :content, :read

  belongs_to :sender, :class_name => "User", :foreign_key => 'sender_id'
  belongs_to :receiver, :class_name => "User", :foreign_key => 'receiver_id'
end

有人能帮忙吗?我不明白为什么它在谈论“Messages”模型,当我只是创建一个简单的“User”...

更新

test/fixtures/messages.yml

one:
  content: MyText
  read: 1

two:
  content: MyText
  read: 1
2个回答

5
在堆栈跟踪中需要查看的行是:
/Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activerecord-3.2.8/lib/active_record/connection_adapters/abstract/database_statements.rb:277:in `insert_fixture'

在测试开始之前,它会读取包含测试数据样本的固件。可能你的固件没有正确的数据(虽然我承认我曾经认为updated_atcreated_at属性会被 Rails 自动管理)。

嗨,汤姆。我其实不知道有装置存在……我想当我生成模型时它们是自动生成的。我应该删除这些装置吗? - bigpotato
3
嘿Tom,我想通了。我的模型名称弄错了(复数形式...糟糕)。我打算按正确的TDD方式重新做一遍这个项目。谢谢。 - bigpotato
如果您使用Rails生成器,它们将生成测试,其中包括一些默认的固定装置。如果您要继续使用TDD,则应该保留它们--除非您想尝试与Rails默认测试环境(rspec + FactoryGirl + Capybara很受欢迎)不同的测试环境,否则它们不会造成任何伤害。 - Tom Harrison

1
如果你从谷歌跳转到这里,可能是因为你在fixture的yaml文件中有created_atupdated_at两列,并且它们为空。我之前就是这样做的,只是从我的注释过的model.rb文件中复制了所有列并转换成yaml格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接