【问题标题】:How to access instance variables in rspec tests如何在 rspec 测试中访问实例变量
【发布时间】:2021-09-28 05:04:16
【问题描述】:

如何在我的 rspec 测试中访问 pic?我不断收到以下错误:

F

Failures:

  1) TrelloToAc::Card#pic return pic url from trello card
     Failure/Error: expect(result).to be_a String
       expected :pic to be a kind of String
     # ./spec/services/trello_to_ac/card_spec.rb:17:in `block (3 levels) in <top (required)>'

Finished in 1.97 seconds (files took 13.5 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/services/trello_to_ac/card_spec.rb:14 # TrelloToAc::Card#pic return pic url from trello card

它似乎从字面上理解pic,就像一个字符串。这是我的代码:

测试:

require 'rails_helper'

RSpec.describe TrelloToAc::Card do
  describe '#pic' do
    it 'return pic url from trello card' do
      result = @pic
      puts result
      expect(result).to be_a String
    end
  end
end

正在测试的代码:

class TrelloToAc::Card
  #
  #
  def pic
    @pic ||= card.attachments.last.url if card.attachments.any?
  end
  #
  #
end

【问题讨论】:

  • 您需要在测试实例上调用pic。您实际上并不想访问实例变量——您想访问它的阅读器。
  • expect(subject.pic).to be_a String 其中subject 是您在规范中拥有的实例。
  • 如果您真的想明确地测试@pic 的值(提示:我99% 确定您不这样做),那么您可以这样做:@987654330 @
  • 但是,您目前向我们展示的内容作为测试实际上没有意义。一种或另一种方式,您需要调用TrelloToAc::Card.new.pic - 即您实际测试该类,而不仅仅是在该类的上下文之外完全分配一个实例变量。

标签: ruby-on-rails ruby rspec rspec-rails


【解决方案1】:

这就是我最终解决此问题的方式。我认为这更像是我的一些评论者所说的。这也提供了更多关于 pic 上下文的信息

测试:

require 'rails_helper'

RSpec.describe TrelloToAc::Card do

  let(:trello_card) do
    cassette = 'trello_to_ac/cards/get'
    VCR.use_cassette(cassette, match_requests_on: [:method]) do
      Trello::Card.find 'itZmoIG4'
    end
  end

  let(:email_sent_label) do
    cassette = 'trello_to_ac/labels/get'
    VCR.use_cassette(cassette, match_requests_on: [:method]) do
      Trello::Label.find '60db99d5230c123a1ab808d0'
    end
  end

  let(:trello_to_ac_card) do
    TrelloToAc::Card.new(trello_card, 32188, 147, email_sent_label)
  end
  
  describe '#pic' do
    it 'returns pic url from trello card' do
      cassette = 'trello_to_ac/attachments/get'
      result = VCR.use_cassette(cassette, match_requests_on: [:method]) do
        trello_to_ac_card.pic
      end
      expect(result).to be_a String
    end
  end
end

实际代码:

class TrelloToAc::Card
  attr_reader(
    :card, :order_number, :list_ac_campaign_id, :email_sent_label
  )

  def initialize(card, order_number, list_ac_campaign_id, email_sent_label)
    @card = card
    @order_number = order_number
    @list_ac_campaign_id = list_ac_campaign_id
    @email_sent_label = email_sent_label
  end

  def send_email_if_needed
    #
    #
    attach_trello_pic_to_ac_contact if pic
    #
    #
  end

  def pic
    @pic ||= card.attachments.last.url if card.attachments.any?
  end
end

这样我测试的是一个类的实例,而不是实例变量。我对其他方法也有类似的测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    相关资源
    最近更新 更多