RSpec double/mock 来自初始值设定项的实例变量

RSpec double/mock instance variable from initializer

我有一个 class,在初始化程序中我需要从已解析的参数中调用实例变量:

class PrintResults
  include SortResults

  attr_accessor :views_hash

  def initialize(parser)
    @parser = parser
    @views_hash = parser.page_views
  end

我想测试属性访问器,我尝试了以下方法:

RSpec.describe PrintResults do
  subject { described_class.new(views_hash) }

  describe 'attributes accessors' do
    let(:accessors) { double(page_views: { '/that_70s_show' => ['111.111.111.111'] }) }

    it 'should have views hash' do
      subject.views_hash = accessors
      expect(subject.views_hash).to eq(['111.111.111.111'])
    end
  end

但我收到一个错误:

  1) PrintResults attributes accessors should have views hash
     Failure/Error: expect(subject.views_hash).to eq(['111.111.111.111'])

       expected: ["111.111.111.111"]
            got: #<Double (anonymous)>

       (compared using ==)

       Diff:
       @@ -1 +1 @@
       -["111.111.111.111"]
       +#<Double (anonymous)>

您将测试替身直接分配给返回的属性,而不是使用 initialize 方法。

而不是

subject { described_class.new(views_hash) }

describe 'attributes accessors' do
  let(:accessors) { double(page_views: { '/that_70s_show' => ['111.111.111.111'] }) }

  it 'should have views hash' do
    subject.views_hash = accessors
    expect(subject.views_hash).to eq(['111.111.111.111'])
  end
end

使用

subject { described_class.new(parser) }

describe 'attributes accessors' do
  let(:parser) { double(page_views: { '/that_70s_show' => ['111.111.111.111'] }) }

  it 'should have views hash' do
    expect(subject.views_hash).to eq('/that_70s_show' => ['111.111.111.111'])
  end
end