ユーザーが「オファー」に関するメッセージを互いに送信できるようにするアプリケーションを作成しています。
少し手間を省いて、 Mailboxer gemを使用しようと思いました。
私は RSpec を使用したテスト駆動開発アプローチに従っています。オファーごとに 1つのみConversation
が許可されるようにするテストを作成しています。belongs_to
2 人の異なるユーザー (オファーを行ったユーザーとオファーを受け取ったユーザー) のオファー。
これが私の失敗したテストです:
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
receive_user にメッセージを 2 回送信します。は次の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
メッセージが送信され、2 人のユーザー間で会話が作成されます。
2 回目の繰り返しでは、最初の繰り返しで作成された会話が返され、ユーザーはその会話に返信しますが、新しい会話は作成されません。
これはすべて機能しますが、テストが失敗し、その理由がわかりません!
上記で指定した場所のコードにこじ開けバインディングを配置すると、何が起こっているのかを調べることができます...今、これをなぞなぞにします:
self.mailbox.conversations[0]
Conversation
インスタンスを返します
self.mailbox.conversations[1]
戻り値nil
self.mailbox.conversations
1 つのオブジェクトを含むコレクションを明確に示しています。
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 で最初と 2 番目の反復を表示する
また...
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。
私が間違っていることはわかりません!これを回避するためにテストを作り直すかもしれません。または、宝石を捨てて自分で書いてください。