我正在编写一个应用程序,允许用户相互发送有关“报价”的消息。
我想我会为自己节省一些工作并使用Mailboxer gem。
我正在使用 RSpec 遵循测试驱动的开发方法。我正在编写一个测试,以确保Conversation
每个报价只允许一个。一个要约belongs_to
两个不同的用户(提出要约的用户和收到要约的用户)。
这是我失败的测试:
describe "after a message is sent to the same user twice" do
before do
2.times { sending_user.message_user_regarding_offer! offer, receiving_user, random_string }
end
specify { sending_user.mailbox.conversations.count.should == 1 }
end
因此,在测试运行之前,用户sending_user
向接收用户发送了两次消息。message_user_regarding_offer!
看起来像这样:
def message_user_regarding_offer! offer, receiver, body
conversation = offer.conversation
if conversation.nil?
self.send_message(receiver, body, offer.conversation_subject)
else
self.reply_to_conversation(conversation, body)
# I put a binding.pry here to examine in console
end
offer.create_activity key: PublicActivityKeys.message_received, owner: self, recipient: receiver
end
因此,在测试的第一次迭代中(发送第一条消息时),conversation
变量是nil
一条消息,并在两个用户之间创建了对话。
在第二次迭代中,返回在第一次迭代中创建的对话,用户回复该对话,但不会创建新对话。
这一切都有效,但是测试失败了,我不明白为什么!
当我在上面指定位置的代码中放置一个 pry 绑定时,我可以检查发生了什么......现在让我困惑:
self.mailbox.conversations[0]
返回一个Conversation
实例
self.mailbox.conversations[1]
返回nil
self.mailbox.conversations
清楚地显示了一个包含一个对象的集合。
self.mailbox.conversations.count
返回2?!
那里发生了什么?方法不正确,我的count
测试失败了......
我错过了什么?或者这是一个错误?!
编辑
offer.conversation
看起来像这样:
def conversation
Conversation.where({subject: conversation_subject}).last
end
和offer.conversation_subject
:
def conversation_subject
"offer-#{self.id}"
end
编辑 2 - 在 pry 中显示第一次和第二次迭代
还...
Conversation.all.count
返回 1!
和:
Conversation.all == self.mailbox.conversations
返回true
和
Conversation.all.count == self.mailbox.conversations.count
返回false
如果数组相等怎么办?我不知道这里发生了什么,现在已经花了好几个小时了。认为这是一个错误?!
编辑 3
从 Mailboxer gem 的来源...
def conversations(options = {})
conv = Conversation.participant(@messageable)
if options[:mailbox_type].present?
case options[:mailbox_type]
when 'inbox'
conv = Conversation.inbox(@messageable)
when 'sentbox'
conv = Conversation.sentbox(@messageable)
when 'trash'
conv = Conversation.trash(@messageable)
when 'not_trash'
conv = Conversation.not_trash(@messageable)
end
end
if (options.has_key?(:read) && options[:read]==false) || (options.has_key?(:unread) && options[:unread]==true)
conv = conv.unread(@messageable)
end
conv
end
该reply_to_convesation
代码可在此处获得 -> http://rubydoc.info/gems/mailboxer/frames。
只是看不到我做错了什么!可能会修改我的测试来解决这个问题。或者放弃宝石并写我自己的。