rspec测试实例方法

时间:2016-04-14 17:12:34

标签: ruby-on-rails rspec factory

如何使用rspec和factory测试这些实例方法?

工厂

FactoryGirl.define do
  factory :user do
    sequence(:email) { |n| "example#{n}@gmail.com"
    password 'example0000'
    password_confirmation 'example0000'
    new_chat_notification { Faker::Number.between(0, 10) }
    new_other_notification { Faker::Number.between(0, 10) } 
  end

  factory :notification do
    notifiable_id { Faker::Number.between(1, 10) }
    notifiable_type { Faker::Lorem.word }
    action { Faker::Hipster.word }
    checked_at { Faker::Time.between(DateTime.now - 2, DateTime.now - 3)  }
    association :sender, factory: :user
    association :recipient, factory: :user
  end
end

user.rb

#check and decrease chat notification that happens between 2 given users (max 1)
def decreasing_chat_notification_number(user)
  notification = self.notifications.between_chat_recipient(user).unchecked.first
  self.checking_and_decreasing_notification(notification) if notification.present?
end

#check and decrease task notifications that happens between 2 given users
def decreasing_task_notification_number(user)
  self.notifications.task.between_other_recipient(user).unchecked.each do |notification|
    self.checking_and_decreasing_notification(notification)
  end
end

更新

user.rb(这是被调用的方法)

def checking_and_decreasing_notification(notification)
  notification.check_notification
  if notification.notifiable_type == "Message"
    decrease_new_chat_notifications
    decreased_chat_number_pusher
  else
    decrease_new_other_notifications
    decreased_other_number_pusher
  end
end

user_spec.rb

let(:sender) { create(:user) }
let(:user) { create(:user) }
let(:notification) { create(:notification, notifiable_type: "Message", recipient: user, sender: sender) }

it "decreasing_chat_notification_number" do
  allow(user).to receive(:checking_and_decreasing_notification).with(notification)
  user.decreasing_chat_notification_number(sender)
  expect(user).to receive(:checking_and_decreasing_notification).with(notification)
end

错误消息:

1) User instance methods decreasing_chat_notification_number
 Failure/Error: expect(user).to receive(:checking_and_decreasing_notification).with(notification)

   (#<User:0x007fefcfd6ce20>).checking_and_decreasing_notification(#<Notification id: 1, 
     recipient_id: 1, created_at: "2016-04-14 19:47:36", updated_at: "2016-04-14 19:47:36", 
     sender_id: 2, checked_at: "2016-04-12 02:32:50", notifiable_id: 4, notifiable_type: "Message", action: "tilde">)
   expected: 1 time with arguments: (#<Notification id: 1, 
     recipient_id: 1, created_at: "2016-04-14 19:47:36", updated_at: "2016-04-14 19:47:36", 
     sender_id: 2, checked_at: "2016-04-12 02:32:50", notifiable_id: 4, notifiable_type: "Message", action: "tilde">)
   received: 0 times

1 个答案:

答案 0 :(得分:1)

(旁注)您的方法中不需要self

看看:

def decreasing_chat_notification_number(user)
  notification = notifications.between_chat_recipient(user).unchecked.first
  checking_and_decreasing_notification(notification) if notification.present?
end


describe '#decreasing_chat_notification_number' do
  let(:notification) { create(:notification) }
  let(:user)         { create(:user) }
  subject            { create(:user) }

  it 'your description' do
    expect(subject).to receive(:checking_and_decreasing_notification).with(notification)
    subject.decreasing_chat_notification_number(user)
  end
end