问题
我不确定如何在 rspec 中测试这种一般模式:
当 X 控制器动作被触发时,检查 Y 属性是否是对象 Z 上的特定值
语境
使用 public_activity 来跟踪用户何时在应用程序中投票、更改投票、编写新提案等。
此跟踪仅由与投票和提案相关的控制器操作触发。因此,您无法在 Vote 和 Proposal 模型本身上测试活动跟踪。
您可以在此 RailsCast http://railscasts.com/episodes/406-public-activity中看到两种不同的活动跟踪方法
我可以很容易地测试 Activity 在触发 vote_controller 的 POST CREATE 操作时是否发生变化(见下文),但我坚持构建事物以测试最新的 Activity(PublicActivity::Activity.last
例如)是否正在记录自定义属性。
describe 'POST creates' do
context 'current user has no other vote in the proposal tree' do
it 'creates a new vote' do
expect {
post :create, vote: { proposal_id: proposal1.id, comment: "Coz it rocks!"}
}.to change(Vote, :count).by(1)
end
it "increases the Activity count by 1" do
expect {
post :create, vote: { proposal_id: proposal1.id, comment: "Coz it rocks!"}
}.to change(PublicActivity::Activity, :count).by(1)
end
end
在我的脑海里,它会是这样的
it "Activity tracks the id of who needs to be notified of the vote" do
post :create, vote: { proposal_id: proposal1.id, comment: "Coz it rocks!"}
expect { PublicActivity::Activity.last.notify_list[0] }.to eq user2.id
end
有人可以建议适当的模式/语法来尝试在 rspec 测试中捕获这一点吗?
编辑:
我还考虑过将其作为 Activity 模型的测试来实现。
所以我将有效地从控制器重新创建逻辑这主要涉及设置至少两个用户,一个提案(与 user1 相关联),一个投票(与 user2 相关联),然后检查来自 user2 的投票是否创建了一个 Activity 对象在它的 notify_list 中包含 user1 的 id
@vote.create_activity :voted, owner: user2, notify_list: create_notify_list(@vote, user2)