2013-04-11 46 views
0

我正在努力涵盖我的单元测试中所有模型的方法,关联和验证,并且到目前为止它效果很好。我已经订阅了TreeHouse并且虔诚地观看了Ruby Foundations - Testing需要帮助了解为什么单元测试方法不起作用

我昨晚无意中发现了这个错误,测试方法为我Provider.rb型号:

class Provider < ActiveRecord::Base 

    attr_accessible :description, :name 
    validates :name, :presence => true 
    validates :description, :presence => true 
    validates :name, :length => { :minimum => 6, :maximum => 100 } 
    validates :description, :length => { :minimum => 6, :maximum => 100 } 
    has_many :courses 
    resourcify 

    def unique_locations 
    Location.joins(sessions: :course).where(courses: { provider_id: self.id }).uniq.pluck('locations.name') 
    end 

end 

我对unique_locations方法单元测试如下:

test 'should return a list of unique locations' do 
    provider = FactoryGirl.build(:provider) 
    assert_equal provider.unique_locations, ["location_1", "location_2"] 
    end 

我得到的运行我的测试后出现以下错误:

<[]> expected but was 
<["location_1", "location_2"]>. 

我的工厂很简单:

FactoryGirl.define do 
    factory :course do 
    name 'Snowboard 101' 
    description 'Snowboard course' 
    association :provider, factory: :provider 
    end 
end 

FactoryGirl.define do 
    factory :provider do 
    name 'The School of Hard Knocks' 
    description 'School description' 
    end 
end 

FactoryGirl.define do 
    factory :session_snowboard, class: Session do 
    name 'Winter Session' 
    description 'Snowboarding 101' 
    price 200 
    class_size 4 
    association :course, factory: :course 
    association :location, factory: :location_1 
    end 

    factory :session_ski, class: Session do 
    name 'skiing 101' 
    description 'Start in november' 
    price 100 
    class_size 4 
    association :course, factory: :course 
    association :location, factory: :location_2 
    end 

end 

FactoryGirl.define do 
    factory :location_1 do 
    name 'location_1' 
    end 

    factory :location_2 do 
    name 'location_2' 
    end 

end 

我的unique_locations方法在我的不同环境中工作正常。我只是无法弄清楚为什么它没有返回测试中唯一位置的列表。

任何想法?

感谢, 弗朗西斯

回答

0

所以经过多次打探与Factory_Girl我找到了解决办法:

这里是我的工厂:

FactoryGirl.define do 
    factory :provider do 
    name 'McGill University' 
    description 'McGill is one of the best universities in the world.' 
    after(:create) {|provider| create_list(:course, 2, provider: provider) } 
    end 
end 

FactoryGirl.define do 
    factory :course do 
    name 'Snowboard 101' 
    description 'Snowboard course' 
    provider 
    after(:create) {|course| create_list(:session, 2, course: course) } 
    end 
end 

FactoryGirl.define do 
    factory :session do 
    name 'Winter Session' 
    description 'Snowboarding 101' 
    price 150 
    class_size 4 
    course 
    location 
    end 
end 

FactoryGirl.define do 
    factory :location do |l| 
    l.sequence(:name) { |n| "location_#{n}"} 
    end 
end 

我也更新了我的测试:

test 'should return a list of unique locations' do 
    provider = create(:provider) 
    assert_equal provider.unique_locations, %w[location_1 location_2 location_3 location_4] 
    end 

此创建成功4个不同的地点。

0

要调用FactoryGirl.build(:provider)只有建立并不会保存到数据库,所以unique_locations显然不会有ID去了。使用create它应该没问题。

+0

感谢您的回复,我正在使用.create,但仍然收到相同的错误消息。 – 2013-04-11 17:24:10