2015-07-01 51 views
0

在我們的Rails應用程序,我們有以下型號:Rails的驗證測試不及格

class User < ActiveRecord::Base 
    has_many :administrations, dependent: :destroy 
    has_many :calendars, through: :administrations 
end 

class Administration < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :calendar 
end 

class Calendar < ActiveRecord::Base 
    has_many :administrations, dependent: :destroy 
    has_many :users, through: :administrations 
end 

我們試着用以下administration_test.rb測試文件來驗證管理模式:

需要「test_helper」

class AdministrationTest < ActiveSupport::TestCase 
    def setup 
    @user = users(:noemie) 
    @administration = Administration.new(user_id: @user.id, calendar_id: @calendar_id) 
    end 

    test "should be valid" do 
    assert @administration.valid? 
    end 

    test "user id should be present" do 
    @administration.user_id = nil 
    assert_not @administration.valid? 
    end 

    test "calendar id should be present" do 
    @administration.calendar_id = nil 
    assert_not @administration.valid? 
    end 

end 

當我們運行測試,我們得到如下結果:

FAIL["test_calendar_id_should_be_present", AdministrationTest, 2015-06-30 07:24:58 -0700] 
test_calendar_id_should_be_present#AdministrationTest (1435674298.26s) 
     Expected true to be nil or false 
     test/models/administration_test.rb:21:in `block in <class:AdministrationTest>' 

FAIL["test_user_id_should_be_present", AdministrationTest, 2015-06-30 07:24:58 -0700] 
test_user_id_should_be_present#AdministrationTest (1435674298.27s) 
     Expected true to be nil or false 
     test/models/administration_test.rb:16:in `block in <class:AdministrationTest>' 

我們有點失落:這是正確的測試方法嗎?

如果不是,我們該怎麼寫呢? 如果是,我們該如何讓它通過?

回答

0

好的,我們找到了解決方案。

我們更新了管理模型如下:

class Administration < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :calendar 

    validates :user_id, presence: true 
    validates :calendar_id, presence: true 

end 

而且還編輯了一administration_test.rb文件:

require 'test_helper' 

class AdministrationTest < ActiveSupport::TestCase 
    def setup 
    @user = users(:noemie) 
    @calendar = calendars(:one) 
    # This code is not idiomatically correct. 
    @administration = Administration.new(user_id: @user.id, calendar_id: @calendar.id) 
    end 

    test "should be valid" do 
    assert @administration.valid? 
    end 

    test "user id should be present" do 
    @administration.user_id = nil 
    assert_not @administration.valid? 
    end 

    test "calendar id should be present" do 
    @administration.calendar_id = nil 
    assert_not @administration.valid? 
    end 

end 

測試現在通過就好了。

+0

好了,看看我的答案,但因爲你的測試很容易發生誤報。 – max

1

這個問題不是你的測試,而是你期待錯誤的結果。

belongs_to在ActiveRecord中不添加驗證,宏只是簡單地創建一個關係。

要驗證關係,您將使用validates_associated,該關係在每個相關記錄上調用#valid?,並確保關聯記錄存在。

class Administration < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :calendar 
    validates_associated :user 
    validates :user, presence: true 
end 

當測試驗證,最好是寫上的錯誤散列的說法,彷彿驗證任何其他原因而失敗assert_not @administration.valid?將給假陽性。

壞:

test "user id should be present" do 
    @administration.user_id = nil 
    assert_not @administration.valid? 
end 

好:

test "user id should be present" do 
    @administration.user_id = nil 
    @administration.valid? 
    assert @administration.errors.key?(:user) 
end