【问题标题】:How can I assert on initialize behaviour with RSpec?如何使用 RSpec 断言初始化行为?
【发布时间】:2011-01-18 10:11:16
【问题描述】:

我有一个消息类,可以通过将参数传递给构造函数来初始化它,或者不传递参数然后稍后使用访问器设置属性。在属性的 setter 方法中进行了一些预处理。

我有一些测试可以确保 setter 方法做他们应该做的事情,但我似乎无法找到一个好的方法来测试 initialize 方法实际上调用了 setter。

class Message
  attr_accessor :body
  attr_accessor :recipients
  attr_accessor :options

  def initialize(message=nil, recipients=nil, options=nil)
    self.body = message if message
    self.recipients = recipients if recipients
    self.options = options if options
  end

  def body=(body)
    @body = body.strip_html
  end
  def recipients=(recipients)
    @recipients = []
    [*recipients].each do |recipient|
      self.add_recipient(recipient)
    end
  end
end

【问题讨论】:

标签: ruby mocking rspec2


【解决方案1】:

我倾向于测试初始化​​器的行为,

即它会按照您的预期设置变量。

不了解实际操作方式,假设底层访问器工作,或者您可以根据需要设置实例变量。它几乎是一个很好的老式单元测试。

例如

describe "initialize" do
  let(:body) { "some text" }
  let(:people) { ["Mr Bob","Mr Man"] }
  let(:my_options) { { :opts => "are here" } }

  subject { Message.new body, people, my_options }

  its(:message)    { should == body }
  its(:recipients) { should == people }
  its(:options)    { should == my_options }
end

【讨论】:

  • 我想也许我的示例代码并不能说明我想要做什么,我将对其进行编辑以更好地解释 - 关键是 setter 方法不只是存储值。我想要测试 setter 方法的所有边缘情况,然后进行测试,告诉我初始化程序正在使用它们,这样我就不必复制测试用例了。
  • 真正你的测试是私有方法。您应该只关心“当我使用这些参数创建消息时会发生什么”,而不是“在消息执行时初始化什么”。这样您的实现就可以更改,而测试可以保持不变。
猜你喜欢
  • 1970-01-01
  • 2014-12-17
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多