【问题标题】:Rails / RSpec: How to test #initialize method?Rails / RSpec:如何测试#initialize方法?
【发布时间】:2010-12-25 13:53:12
【问题描述】:

如何使用 RSpec 指定 #initialize 行为?例如这里:

generator.rb

class Generator
  attr_accessor :seed

  def initialize(seed = nil)
    @seed = seed || pick_seed
  end

  def pick_seed
    Time.now.to_i
  end
end

generator_spec.rb

require 'generator'

describe Generator

  it "calls 'pick_seed' method unless seed specified" do
  end

end

我想设定期望 pick_seed 方法从 #initialize 方法调用。

【问题讨论】:

    标签: ruby rspec2


    【解决方案1】:

    对我来说,期望是设计协作者之间的对话。所以,您必须决定 - #pick_seed 是内部实现细节还是协作角色接口的一部分?

    如果pick_seed 是一个实现细节,则期望是该工作的错误工具。而且,由于您有一个种子访问器,因此您可以继续进行(注意每个示例一个断言):

    class Generator
      attr_accessor :seed
    
      def initialize(seed = nil)
        @seed = seed || pick_seed
      end
    
      def pick_seed
        Time.now.to_i
      end
    end
    
    describe Generator do
      context "creating" do 
        context "when a seed is specified" do
          it "uses that seed" do
            seed = 123
            generator = Generator.new(seed)
            generator.seed.should == seed
          end
        end
        context "when a seed is not specified" do
          it "creates its own seed" do
            generator = Generator.new
            generator.seed.should_not be_nil
          end
        end
      end
    end
    

    OTOH,如果选择种子是“种子选择器”角色的一部分,那么模拟在设计种子选择器时很有价值,并且依赖注入是分配角色的标准方法。你可以这样写:

    class GeneratorWithCollaborator
      attr_accessor :seed
    
      def initialize(seed = nil, seed_picker = self)
        @seed = seed || seed_picker.pick_seed
      end
    
      def pick_seed
        Time.now.to_i
      end
    end
    
    describe GeneratorWithCollaborator do
      context "creating" do
        context "when a seed is specified" do
          it "uses that seed" do
            seed = 123
            seed_picker = double('seed picker')
            seed_picker.should_not_receive(:pick_seed)
            generator = GeneratorWithCollaborator.new(seed, seed_picker)
            generator.pick_seed
          end
        end
    
        context "when a seed is not specified" do
          it "delegates to its seed picker" do
            seed_picker = double('seed picker')
            seed_picker.should_receive(:pick_seed)
            generator = GeneratorWithCollaborator.new(nil, seed_picker)
          end
        end
      end
    end
    

    【讨论】:

    • 在第一个代码块中,即使种子相同且尚未生成,generator.seed.should_not be_nil 也不会工作吗?但即使你测试generator.seed.should_not == seed,这个测试不会依赖于随机生成器,而不是偶尔偶尔创建相同的种子吗?
    • 我可能会将def pick_seed 设为私有太fwiw。考虑到配件,这似乎不是公开可用的东西 - 但我想这是不可能知道的。
    猜你喜欢
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多