Rspec测试或类似(|| =)运算符

时间:2011-03-01 12:05:33

标签: ruby-on-rails ruby testing mocking rspec

我想知道有没有办法测试表达式:

var[:test] ||= "value"

使用Rspec。基本上我希望能够指定类似的东西:

var = mock
var.should_receive(:[]||=).with(:test)

更确切地说,我想测试||=是否适用于var [:test]。

感谢。

3 个答案:

答案 0 :(得分:7)

构造var[:test] ||= value实质上意味着:

if there is a key :test in hash
   var[:test] should remain what it is
else
   var[:test] = value

这意味着你手上有两个测试,类似于:

it "should not override var[:test]"
it "should set var[:test] to be equal to 'value'"

例如,假设你有一个班级:

class Blah
  attr_reader :var
  def initialize(var={})
    @var=var
  end
  def set_test_key(value)
    var[:test] ||= "value"
  end
end

您可以执行以下操作:

describe Blah do
  it "should not override var[:test]" do
    blah = Blah.new({:test=>"foo"})
    blah.set_test_key("bar")
    blah.should equal("foo")
  end
  it "should set var[:test] to be equal to 'bar'" do
    blah = Blah.new
    blah.set_test_key("bar")
    blah.should equal("bar")
  end
end

这是它的要点,需要适应你的情况。

答案 1 :(得分:1)

没有:[]||=运算符。

var[:test] ||= value

只是

的简写
var[:test] = var[:test] || value

答案 2 :(得分:0)

不确定模拟,但假设代码在方法中:

def value
  @value ||= "value"
end

你可以简单地调用它两次并检查两个对象是否相同:

it "should memoize the value" do
  value.should equal(value)
end