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
我正在为这样的方法编写测试:
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