我有以下課程:
class UserRewards
def self.grant(reward_id:, submission_id:, user_id:)
puts 'Hello from UserRewards.grant'
debugger
ActiveRecord::Base.transaction do
puts 'ActiveRecord::Base.transaction'
end
end
end
以及以下測驗:
require 'rails_helper'
RSpec.describe UserRewards do
describe '.grant' do
it 'grants a reward to a user' do
user = build_stubbed(:user)
submission = build_stubbed(:submission)
reward = build_stubbed(:reward)
UserRewards.grant(
reward_id: reward.id,
submission_id: submission.id,
user_id: user.id,
)
expect(ActiveRecord::Base).to receive(:transaction)
end
end
end
我只是想驗證ActiveRecord::Base
已經收到:transaction
,當我運行測驗時,但無論我做什么,或者我如何嘗試重組這個測驗,我總是得到以下失敗:
1) UserRewards.grant grants a reward to a user
Failure/Error: expect(ActiveRecord::Base).to receive(:transaction)
(ActiveRecord::Base (class)).transaction(*(any args))
expected: 1 time with any arguments
received: 0 times with any arguments
我已經驗證該方法正在通過除錯器運行:
(rdbg) n # next command
[1, 10] in ~/workspace/my-app/lib/services/user_rewards.rb
1| class UserRewards
2| def self.grant(reward_id:, submission_id:, user_id:)
3| debugger
4| ActiveRecord::Base.transaction do
=> 5| puts 'ActiveRecord::Base.transaction'
6| end
7| end
8|
9| def self.revoke(reward_id:, submission_id:, user_id:)
=>#0 block in grant at ~/workspace/my-app/lib/services/user_rewards.rb:6
#1 block in within_new_transaction at ~/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/connection_adapters/abstract/transaction.rb:319
# and 74 frames (use `bt' command for all frames)
我知道我在這里一定做錯了什么。我不必在 ActiveRecord::Base 上存根方法,對嗎?我不是最熟練的測驗人員,但我正在努力變得更好。像這樣的頭痛總是讓我無法擁有經過良好測驗的代碼......
uj5u.com熱心網友回復:
如果你只需要知道一個事務被呼叫,你可以存根這個方法,然后檢查它是否被呼叫。你it
很胖,最好用AAA原則
require 'rails_helper'
describe UserRewards do
describe '.grant' do
let(:user) { build_stubbed(:user) }
let(:submission) { build_stubbed(:submission) }
let(:reward) { build_stubbed(:reward) }
before do
allow(ActiveRecord::Base).to receive(:transaction)
described_class.grant(
reward_id: reward.id,
submission_id: submission.id,
user_id: user.id,
)
end
it 'calls database transaction' do
expect(ActiveRecord::Base).to have_received(:transaction).once
end
end
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/508360.html
下一篇:Ruby版本安裝后不更新