我在一个使用AR的非Rails应用程序中遇到了一个令人头疼的问题,我无法理解。我将大大简化,但关键是:我有一个属于Ledger的下载对象。在我的一个单元测试中,我遇到了以下情况:
dl = create(:download, account: checking)
dl.ledger
=> <Byr::Ledger:0x00007fd176ce4740
id: 2,
name: "test_ledger_1",
org_name: "Test Ledger, Inc.",
street1: nil,
street2: nil,
city: nil,
state: nil,
zip: nil,
created_at: 2022-04-03 13:13:53.734003153 UTC,
updated_at: 2022-04-03 13:13:53.792451592 UTC,
default_account_id: 21,
short_name: "Test_ledger_1",
parent_percent: nil,
parent_id: nil,
accessed_at: 2022-04-03 13:13:53.791911547 UTC,
start_date: Mon, 01 Jan 2018,
cost_method: "fifo",
end_date: nil
> dl.ledger.peristed? => true
> Ledger.find(2) => nil with eval error: Couldn't find Byr::Ledger with 'id'=2
我使用factory_bot创建了Download,dl,它反过来为它构建了一个账本,它声称是用id=2持久化的。但是当我尝试用ledger.find(2(查找账本时,它不在postgresqldb中。
有人知道这里可能发生了什么吗?
我认为你应该使用faker+factory_bot和mock资源来访问你需要的参数。这里是一个使用示例。希望这能帮助
我最终通过显式地将分类账传递到创建下载工厂的Account工厂来实现这一点,如下所示:
let(:ldg) { create(:ledger, name: 'Willy') }
let(:checking) { create(:bank_account, ledger: ldg) }
let(:dl) { create(:download, account: checking) }
突然,消失的壁架消失了。我相信cuplrit可能是DatabaseCleaner将自动生成的分类账从一个例子清除到另一个例子。只为这个例子使用一个明确的分类账,可以防止它在我脚下被删除。
谢谢你,@Joe,给了我一些思考。