我正在使用Rails 5.0.2和factory_girl_rails以及RSpec。
我有3个这样的联想模型:
/app/models/ticket.rb
class Ticket < ActiveRecord::Base
has_many :ticket_snapshots, foreign_key: "duckduck_ticket_id"
end
/app/models/ticket_snapshot.rb
class TicketSnapshot < ActiveRecord::Base
belongs_to :duckduck_ticket, class_name: "Ticket"
has_many :matched_issues_summary, class_name: "CookbookReportSummaryVw", foreign_key: "duckduck_ticket_snapshot_id"
end
/app/models/cookbook_report_summary_vw.rb
class CookbookReportSummaryVw < ActiveRecord::Base
self.table_name = 'cookbook_report_summary_vw'
belongs_to :duckduck_ticket_snapshot, class_name: "TicketSnapshot"
belongs_to :duckduck_cookbook, class_name: "Cookbook"
end
正如你所看到的,cookbook_report_summary_vw实际上不是一个数据库表,但它更像是一个数据库视图(在应用程序中工作得很好,但似乎factory_girl不太喜欢它,我会告诉你错误后)
以下是我的factory_girl工厂的上述模型:
工厂/ tickets.rb
FactoryGirl.define do
factory :ticket do
title 'ticket'
ticket_id '11111111'
factory :ticket2 do
title 'something bad happened'
issue 'unknown'
requester 'duckie_duck'
after(:create) do |ticket|
ticket.ticket_snapshots << create(:TicketSnapshot, duckduck_ticket: ticket)
end
end
end
end
工厂/ ticketsnapshots.rb
FactoryGirl.define do
factory :TicketSnapshot do
association :duckduck_ticket
factory :snapshot1 do
status 'Pending'
closure_code nil
root_cause 'other'
after(:create) do |ts|
ts.matched_issues_summary << create(:CookbookReportSummaryVw, duckduck_ticket_snapshot: ts)
end
end
end
end
工厂/ cookbook_report_summary_view.rb
FactoryGirl.define do
factory :CookbookReportSummaryVw do
association :duckduck_ticket_snapshot
factory :summary_true do
status 'true'
end
end
end
在我的工厂中,我已经定义了一个票证可以有多个ticket_snapshots,每个ticket_snapshot可以有许多cookbook_report_summary。
在RSPec中,如果我只尝试创建一个票证,我不会收到任何错误(好吧,如果我在factories / tickets.rb中删除了after(:create));但是在那里有那条线,我永远无法创建快照,我收到了这个错误:
ActiveRecord::StatementInvalid:
PG::UndefinedTable: ERROR: relation "cookbook_report_summary_vw" does not exist
LINE 8: WHERE a.attrelid = '"cookbook_report_summary_...
SELECT a.attname, format_type(a.atttypid, a.atttypmod),
pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod,
(SELECT c.collname FROM pg_collation c, pg_type t
我不确定我是否没有正确定义我的关联,或者factory_girl无法与PostgreSQL视图交互。
我找到了factory_girl与数据库视图交互的解决方案,但我不太明白如何更改cookbook_report_summary_vw以遵守:https://github.com/thoughtbot/factory_bot/issues/449
经过一整天的工作后,我想我们会问你的专家意见。我应该说,如果我的用例中有更好的替代品,我不一定需要使用factory_girl。
非常感谢任何帮助。
答案 0 :(得分:0)
为了关闭而回答,正如Josh所说,我的测试环境迁移不是最新的,工厂女孩是无辜的!