【问题标题】:timecop.travel test returns false instead of true - railstimecop.travel 测试返回 false 而不是 true - rails
【发布时间】:2020-11-09 06:10:59
【问题描述】:

我正在编写一个单元测试来检查 24 小时是否已过。如果 24 小时过去了,那么它应该返回 true

这是我的尝试

test   "messenger tag is more than 24 hours" do
        
        Timecop.travel 2.days.ago
        account = accounts(:messenger_v2)
        contact_d = Contact.create! account: account, name: 'Mr Right', phone_number: nil, external_id: '155581474881005', contact_type: 'MessengerV2', source: 'Inbound', is_registered: true, primary_contact: true
        conversation = Conversation.create! contact: contact_d, account: account, status: 'Open', unread: true, conversation_type: 'Private'
        Message.create! contact: contact_d, message_type: 'Text', text: 'I have some enquries', direction: 'IN', account: account, conversation: conversation, external_id: "in_a#{Time.now.to_i.to_s}"
        msg = conversation.messages.incoming
        time_created = msg.last.created_at
        messenger_tags = time_created < 24.hours.ago
        assert_equal true, messenger_tags
            
    end

当我在这里运行测试时是输出

test_messenger_tag_is_more_than_24_hours                        FAIL (0.14s)
        Expected: true
          Actual: false
        test/models/message_test.rb:175:in `block in <class:MessageTest>'

请帮忙

【问题讨论】:

  • conversation.messages.incoming 是否创建新消息?你能分享一下代码吗?
  • @Anuj 我已经添加了

标签: ruby-on-rails ruby ruby-test timecop


【解决方案1】:

创建消息后,您需要使用Timecop.returnturn off Timecop

test "messenger tag is more than 24 hours" do
    Timecop.travel 2.days.ago
    account = accounts(:messenger_v2)
    contact_d = Contact.create! account: account, name: 'Mr Right', phone_number: nil, external_id: '155581474881005', contact_type: 'MessengerV2', source: 'Inbound', is_registered: true, primary_contact: true
    conversation = Conversation.create! contact: contact_d, account: account, status: 'Open', unread: true, conversation_type: 'Private'
    Message.create! contact: contact_d, message_type: 'Text', text: 'I have some enquries', direction: 'IN', account: account, conversation: conversation, external_id: "in_a#{Time.now.to_i.to_s}"
    Timecop.return
    msg = conversation.messages.incoming
    time_created = msg.last.created_at
    messenger_tags = time_created < 24.hours.ago
    assert_equal true, messenger_tags
end

更新 或者您可以阻止Timecop.travel,以避免调用@Stefan 在下面的评论中提到的Timecop.return

test "messenger tag is more than 24 hours" do
    Timecop.travel 2.days.ago do
        account = accounts(:messenger_v2)
        contact_d = Contact.create! account: account, name: 'Mr Right', phone_number: nil, external_id: '155581474881005', contact_type: 'MessengerV2', source: 'Inbound', is_registered: true, primary_contact: true
        conversation = Conversation.create! contact: contact_d, account: account, status: 'Open', unread: true, conversation_type: 'Private'
        Message.create! contact: contact_d, message_type: 'Text', text: 'I have some enquries', direction: 'IN', account: account, conversation: conversation, external_id: "in_a#{Time.now.to_i.to_s}"
        msg = conversation.messages.incoming
        @time_created = msg.last.created_at
    end
    messenger_tags = @time_created < 24.hours.ago
    assert_equal true, messenger_tags
end

【讨论】:

  • Timecop.travel 也接受一个自动返回当前时间的块。
  • 是的@Stefan 我已将您的建议包含在答案中。谢谢你:)
  • 添加块会导致错误NameError: undefined local variable or method `conversation' for #&lt;MessageTest:0x0000558e2daa43b0&gt;@SampatBadhe
  • 哎呀我的错。这是由于变量的范围。我已经更新了答案,请你现在看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 2014-04-24
  • 1970-01-01
相关资源
最近更新 更多