我正在尝试测试,因此用户无法向自己发送消息。目前在我的新消息视图中,我有一个选择框,它提供系统中除current_user之外的所有用户的选择。目前我只有一个测试,它不允许用户从选择框中选择自己作为收件人:
it { should_not have_select(:receiver_id, :options => [user.name]) }
然而,这是否足以进行测试?我是否需要测试创建新消息,将:receiver_id设置为current_user的id并检查它?如果是这样,我会在模型或请求中将此规范放在哪里?
编辑(在消息模型中添加了验证方法,但即使我注释掉了验证行,我的rspec仍然通过):
编辑2(错误哈希的测试未通过):
Message.rb:
validate :validate_sender_receiver
def validate_sender_receiver
if self.receiver_id == self.sender_id
errors.add(:receiver_id, "Cannot send message to self")
end
end
messages_spec.rb
describe "sending message to yourself" do
before do
@message = user.sent_messages.new(:receiver_id => user.id)
end
it "should not be valid" do
@message.should_not be_valid
end
it "should set the error hash" do
@message.errors.should include("Cannot send message to self")
end
end
答案 0 :(得分:1)
如果用户攻击您的选择并将自己添加到可能的值,您可能会得到一条您不想要的消息。我不知道您的控制器的操作是什么样的,但您应该在模型中测试它,如果接收方与发送方相同,您的模型应拒绝该消息。
答案 1 :(得分:0)
我改变了:
it "should set the error hash" do
@message.errors.should include("Cannot send message to self")
end
为:
it "should set the error hash" do
@message.errors.should have_key(:receiver_id)
end
它现在运作良好,仍然不明白为什么第一种方法不起作用? has_key只是检查是否有密钥,但是如果它是空的则没有?