【问题标题】:Rswag and FactoryBot - how to make them play nicely?Rswag 和 FactoryBot - 如何让它们玩得很好?
【发布时间】:2022-11-15 09:56:47
【问题描述】:

我正在尝试针对新创建的记录的帐户编写一些 ActiveRecord 验证的 Rswag 测试。

我遇到的问题是我不知道如何使用 FactoryBot 创建一个帐户,然后在测试运行时它仍然存在。由于模型验证使用数据库层来获取记录,因此它仍需要在 FactoryBot 创建记录的上下文中。

我无法在测试外定义模型,也无法在测试内修改参数。

可以解决这个问题的一件事是,如果有一种方法可以在不使用 let 的情况下从测试内部修改参数。但我在文档中找不到任何相关信息。

有没有其他人遇到过这个问题并找到了解决方案?我觉得我不能成为唯一一个尝试以这种方式编写测试的人。

我试过这种方式(简化代码):

parameter name: :account_id, in: :query, type: :integer

response(422, 'account not permitted') do
    account = FactoryBot.create(:account, forbidden: true)
    let(:account_id) { account.id }

    run_test!
end

这正确地将参数设置为新创建的帐户的 ID,但是当验证代码在模型类中运行时,就 ActiveRecord 而言,帐户不存在,我假设是因为它不是在“内部”创建的测试。

我也试过这种方式:

parameter name: :account_id, in: :query, type: :integer

response(422, 'account not permitted') do
    before do
      account = FactoryBot.create(:account, forbidden: true)
      let(:account_id) { account.id }
    end

    run_test!
end

这种方式失败了,因为您不能从 before 块内部调用 let。不确定为什么要阻止这种情况,但我确定这是有充分理由的。

【问题讨论】:

    标签: factory-bot rswag


    【解决方案1】:

    当然,当我发布这个时,我突然意识到解决方案。拨打 FactoryBot 电话里面let 块。

    response(422, 'account not permitted') do
        let(:account_id) do 
          account = FactoryBot.create(:account, forbidden: true)
          account.id
        end
    
        run_test!
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 2011-09-14
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      相关资源
      最近更新 更多