预期行为 FactoryBot
Expected behavior FactoryBot
我正在测试 rake 任务 - update_city_status_for_users
:
task update_city_status_for_users: :environment do
User.update_city_statuses do |user, new_status|
# does something
end
end
方法User.update_city_statuses
:
def self.update_city_statuses(&block)
users_ids = Journey.valid.where.not(user_id: nil).pluck(:user_id) # Only journeys (valid) for route 1
users_with_journeys = self.where(id: users_ids)
Rails.logger.info "Only update users with at least one journey: #{users_with_journeys.count} users to update."
ActiveRecord::Base.transaction do
users_with_journeys.each do |u|
new_status = u.new_status?
if new_status != nil
begin
u.update!(city_status: new_status)
yield(u,new_status) if block_given?
rescue => exception
Rails.logger.error "Exception updating user with id #{u.id}. Exception: "+exception.to_s
end
end
end
end
end
这是测试:
RSpec.describe do
describe "update_city_status_for_users" do
it 'updates users with their corespondent new city status: from nil to "Venice"' do
user = user_with_journeys(5, "Venice")
city_status_before_task = user.city_status
BicycleIsland::Application.load_tasks
Rake::Task['update_city_status_for_users'].invoke
expect(city_status_before_task).to eq nil
expect(user.city_status).to be_an_instance_of CityStatus
expect(user.city_status.city).to eq "Venice"
end
end
end
user_with_journeys
是在用户工厂所在的位置定义的,基本上它会创建一个具有 5 个旅程的用户。
在测试中调用任务后,我检查了用户变量(工厂创建):
user.city_status
# nil
但是,当我从数据库中提取用户时,关联已经建立并且 city_status 不是零:
User.find(user.id).city_status
# #<CityStatus id: 6, level: 6, city: "Venice", distance: 1730, created_at: "2020-11-18 17:11:32", updated_at: "2020-11-18 17:11:32", image_file_name: "Venice-1000.png">
两个用户相同:
User.find(user.id) == user
# true
但是直接调用工厂时city_status是没有关联的。那不是我期望的行为。我希望继续进行已进行的更新和关联。
我可能遗漏了什么?谁能帮我指出来?
谢谢!
Rails 缓存模型实例以避免重复的数据库查询。您需要致电
user.reload
在断言之前用数据库中的最新值更新对象。
我正在测试 rake 任务 - update_city_status_for_users
:
task update_city_status_for_users: :environment do
User.update_city_statuses do |user, new_status|
# does something
end
end
方法User.update_city_statuses
:
def self.update_city_statuses(&block)
users_ids = Journey.valid.where.not(user_id: nil).pluck(:user_id) # Only journeys (valid) for route 1
users_with_journeys = self.where(id: users_ids)
Rails.logger.info "Only update users with at least one journey: #{users_with_journeys.count} users to update."
ActiveRecord::Base.transaction do
users_with_journeys.each do |u|
new_status = u.new_status?
if new_status != nil
begin
u.update!(city_status: new_status)
yield(u,new_status) if block_given?
rescue => exception
Rails.logger.error "Exception updating user with id #{u.id}. Exception: "+exception.to_s
end
end
end
end
end
这是测试:
RSpec.describe do
describe "update_city_status_for_users" do
it 'updates users with their corespondent new city status: from nil to "Venice"' do
user = user_with_journeys(5, "Venice")
city_status_before_task = user.city_status
BicycleIsland::Application.load_tasks
Rake::Task['update_city_status_for_users'].invoke
expect(city_status_before_task).to eq nil
expect(user.city_status).to be_an_instance_of CityStatus
expect(user.city_status.city).to eq "Venice"
end
end
end
user_with_journeys
是在用户工厂所在的位置定义的,基本上它会创建一个具有 5 个旅程的用户。
在测试中调用任务后,我检查了用户变量(工厂创建):
user.city_status
# nil
但是,当我从数据库中提取用户时,关联已经建立并且 city_status 不是零:
User.find(user.id).city_status
# #<CityStatus id: 6, level: 6, city: "Venice", distance: 1730, created_at: "2020-11-18 17:11:32", updated_at: "2020-11-18 17:11:32", image_file_name: "Venice-1000.png">
两个用户相同:
User.find(user.id) == user
# true
但是直接调用工厂时city_status是没有关联的。那不是我期望的行为。我希望继续进行已进行的更新和关联。
我可能遗漏了什么?谁能帮我指出来?
谢谢!
Rails 缓存模型实例以避免重复的数据库查询。您需要致电
user.reload
在断言之前用数据库中的最新值更新对象。