gpt4 book ai didi

ruby-on-rails - 如何测试锁机制

转载 作者:太空宇宙 更新时间:2023-11-03 16:13:16 25 4
gpt4 key购买 nike

我有一段代码,我将 BankAccountTransaction 导入到 BankAccount

 bank_account.with_lock do
transactions.each do |transaction|
import(bank_account, transaction)
end
end

它工作正常,但我需要为它编写一个 RSpec 案例,这样我就可以 100% 确定我没有两次导入交易。

我写了下面的助手

module ConcurrencyHelper
def make_concurrent_calls(function, concurrent_calls: 2)
threads = Array.new(concurrent_calls) do
thread = Thread.new { function.call }
thread.abort_on_exception = true

thread
end

threads.each(&:join)
end
end

我在 RSpec 上调用它

context 'when importing the same transaction twice' do
subject(:concurrent_calls) { make_concurrent_calls(operation) }

let!(:operation) { -> { described_class.call(params) } }
let(:filename) { 'single-transaction-response.xml' }

it 'creates only one transaction' do
expect { concurrent_calls }.to change(BankaccountTransaction, :count).by(1)
end
end

但什么也没有发生,测试服卡在了这一点上,没有抛出任何错误或类似的东西。

我在实例化线程并尝试调用该函数后立即放置了一个调试点 (byebug),它运行良好,但当我加入线程时,没有任何反应。

到目前为止我尝试过的事情

  • threads.each(&:join) 之前设置断点并调用函数(工作正常)
  • rspec 示例中的断点和调试 operationparams(都很好)

还有什么想法吗?

编辑

这是我当前的 DatabaseCleaner 配置

RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.clean_with(:deletion)
end

config.before do
DatabaseCleaner.strategy = :transaction
end

config.before(:each, js: true) do
DatabaseCleaner.strategy = :deletion
end

config.before do
DatabaseCleaner.start
end

config.after do
DatabaseCleaner.clean
end
end

我还没有尝试修改策略为:deleteion,我也会这样做

最佳答案

with_lock 是 Rails 的实现,我们不需要测试。您可以使用 mock并检查您的代码是否调用了 with_lock。这里唯一的技巧是确保交易被导入(即 with_lock 中的代码被执行)。 RSpec 将提供您可以调用的 block 。下面是您如何做到这一点的片段 - 可以找到完整的工作实现 here .

describe "#import_transactions" do
it "runs with lock" do
# Test if with_lock is getting called
expect(subject).to receive(:with_lock) do |*_args, &block|
# block is provided to with_lock method
# execute the block and test if it creates transactions
expect { block.call }
.to change { BankAccountTransaction.count }.from(0).to(2)
end

ImportService.new.import_transactions(subject, transactions)
end
end

关于ruby-on-rails - 如何测试锁机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55339129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com