Rspec 测试迭代

Rsepc testing iteration

我正在为这样的方法编写测试:

  def get_team_members(project_id)
    team_members = []

    Result.where(project_id: project_id).each do |result|
      user = User.find_by(id: result.user_id)
      team_members.push(user) unless user.nil?
    end

    team_members
  end

当我测试只找到 1 result 条记录的情况时,我可以这样做

allow(Result).to receive(:where).with(project_id:project_id).and_return([result1])

allow(User).to receive(:find_by).with(id: valid_result[:user_id]).and_return(nil)

allow(Result).to receive(:where).with(project_id:project_id).and_return([result1])

allow(User).to receive(:find_by).with(id: valid_result[:user_id]).and_return(user1)

问题1:如果我想在找到2条result条记录时进行测试

allow(Result).to receive(:where).with(project_id:project_id).and_return([result1, result2])

并且对于 result1 找到匹配的 user (user1),对于 result2 没有找到匹配的 user (nil ).

在这种情况下,预期返回值应为 team_members = [user1]

如何使用不同的返回值 (user1, nil) 模拟两次 User.find_by()

问题2:我真的需要测试我上面提到的案例吗?

关于你的问题2,是的,最好测试多条记录的场景,因为你有一个循环。 你如何模拟你的数据:

let(:user_id1) { 1 }
let(:user_id2) { 2 }
let(:user1) { double(:user, id: user_id1) }
let(:user2) { double(:user, id: user_id2) }

before do
  allow(Result).to receive(:where).with(project_id: project_id).and_return([result1, result2])
  allow(result1).to receive(:user_id).and_return(user_id1)
  allow(result1).to receive(:user_id).and_return(user_id2)
  allow(User).to receive(:find_by).with(id: user_id1).and_return(user1)
  allow(User).to receive(:find_by).with(id: user_id2).and_return(user2)
end