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

Ruby 来自初始值设定项的RSpec double/mock实例变量,ruby,rspec,Ruby,Rspec,我有一个类,在初始化器中,我需要从解析的参数调用实例变量: class PrintResults include SortResults attr_accessor :views_hash def initialize(parser) @parser = parser @views_hash = parser.page_views end 我想测试属性访问器,我尝试了以下方法: RSpec.describe PrintResults do subject

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

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)>
1)PrintResults属性访问器应具有哈希视图
失败/错误:expect(subject.views_hash).to eq(['111.111.111.111'])
预期:[“111.111.111.111”]
得到:#
(使用==进行比较)
差异:
@@ -1 +1 @@
-["111.111.111.111"]
+#

您可以直接将测试双精度分配给返回的属性,而不是使用
初始化
方法

而不是

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
使用


您可以直接将test double分配给返回的属性,而不是使用
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
使用


这可能不是你的问题的答案,但这是根据你的规格来考虑的:

在这种粒度级别上进行测试没有多大好处(您需要测试实现的细节)。如果您测试使用这些属性的函数,您将测试这些属性作为副作用。不要过度测试

功能级别的规格说明/测试(单元测试)将简化您的流程和代码设计。因为您的代码已经使用函数进行了模块化,所以使用相同的级别或粒度/命名来组织规范会有所帮助


不要编写与您的实现细节相耦合或泄漏的测试。

< P>这可能不是您的问题的答案,但这是根据您的规格考虑的:

在这种粒度级别上进行测试没有多大好处(您需要测试实现的细节)。如果您测试使用这些属性的函数,您将测试这些属性作为副作用。不要过度测试

功能级别的规格说明/测试(单元测试)将简化您的流程和代码设计。因为您的代码已经使用函数进行了模块化,所以使用相同的级别或粒度/命名来组织规范会有所帮助

不要编写与实现细节相耦合的测试,也不要泄露实现细节