如何在 rspec 测试中访问实例变量

How to access instance variables in rspec tests

如何在我的 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

上下文的更多信息

测试:

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

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