错误:双:赞助商收到意外消息:users_with_unspent_rewards with(no args)

时间:2014-11-25 18:22:41

标签: rspec

我有以下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

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

原来问题出在规范的第一行:

subject(:sponsor) { double(:sponsor) }

我正在测试正在测试的模型。一旦我删除了该行并从奖励定义行中删除了赞助商信息,测试就通过了。

获得的经验教训:不要将模型或测试方法存在 - 只是方法的内部。