我有以下RSpec测试:
describe "#users_with_unspent_rewards" do
subject(:sponsor) { double(:sponsor) }
let!(:reward) { double(sponsor: sponsor, cost: 300) }
let!(:user) { double }
before do
allow(subject).to receive(:rewards).and_return([reward])
allow(subject).to receive_message_chain(:users, :active).and_return([user])
allow(subject).to receive(:any_rewards_user_can_buy?).with(user).and_return(true)
end
its(:users_with_unspent_rewards) { is_expected.to eq([user]) }
end
我的意图是方法users_with_unspent_rewards
应该返回任何未花费的奖励的用户'费用高于赞助商的奖励'成本。
我得到的错误是:
1) Sponsor#users_with_unspent_boost_rewards users_with_unspent_boost_rewards
Failure/Error: its(:users_with_unspent_rewards) { is_expected.to eq([user]) }
Double :sponsor received unexpected message :users_with_unspent_rewards with (no args)
# ./spec/models/sponsor_spec.rb:237:in `block (3 levels) in <top (required)>'
(第237行是该方法结尾的&#34;其&#34;行。
我期待看到的是方法&#39; users_with_unspent_rewards&#34;应标记为未在赞助商模型中定义。
私有方法any_rewards_user_can_buy?定义如下:
def any_rewards_user_can_buy?(user)
rewards.any? { |r| r.cost < user.boost_balance }
end
我建议的方法是:
def users_with_unspent_rewards
@users ||= users.active.select { |u| any_rewards_user_can_buy?(u) }
end
任何帮助将不胜感激。
答案 0 :(得分:0)
原来问题出在规范的第一行:
subject(:sponsor) { double(:sponsor) }
我正在测试正在测试的模型。一旦我删除了该行并从奖励定义行中删除了赞助商信息,测试就通过了。
获得的经验教训:不要将模型或测试方法存在 - 只是方法的内部。