gpt4 book ai didi

ruby-on-rails - RSpec 测试 `rand` 内部 `rand`

转载 作者:行者123 更新时间:2023-11-28 21:12:44 24 4
gpt4 key购买 nike

我正在开发的游戏中有以下方法:

  def search
if rand(5) == 0
weapon = Weapon.offset(rand(Weapon.count)).first
users_weapon = UsersWeapon.create(user_id: self.id, weapon_id: weapon.id, ammo: weapon.max_ammo)
self.users_weapons << users_weapon
{ :success => 'true', :weapon => users_weapon }
else
{ :success => 'false' }
end
end

如你所见,我有两个 rand
现在,当我尝试使用 rspec 对其进行测试时,我想测试以下内容:

context 'when searches location' do
subject(:user) { FactoryGirl.create :User }
before { FactoryGirl.create :knife }
before { FactoryGirl.create :pistol }

context 'when finds knife' do
before { srand(2) }
it { user.search[:weapon].weapon.name.should == 'Knife' }
end

context 'when finds pistol' do
before { srand(3) }
it { p user.search[:weapon][:name].should == 'Pistol' }
end

无论我在 srand 中传递什么,它都只能以两种方式之一工作:
a) 返回手枪
或者
b) 返回零。

我想独立地 stub 这些rand。我不想在每个上下文中只播种一个 weapon 因为我想实际测试随机武器选择。我该如何执行?

最佳答案

为您的方法使用意图揭示名称,然后模拟该方法而不是 rand

def search
if rand(5) == 0
weapon = Weapon.find_random
# ...

class Weapon
# ...
def self.find_random
self.offset(rand(self.count)).first

现在你可以轻松模拟Weapon.find_random

如果需要,稍后可以轻松更改您的实现

class Weapon
# ...
def self.find_random
# postgres
self.order("RANDOM()").limit(1).first
# mysql
self.order("RAND()").limit(1).first

关于ruby-on-rails - RSpec 测试 `rand` 内部 `rand`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17391043/

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