Тест Rspec или похожий (|| =) оператор - PullRequest
0 голосов
/ 01 марта 2011

Мне интересно, есть ли способ проверить выражение вроде:

var[:test] ||= "value"

с использованием Rspec.В основном я хотел бы иметь возможность указать что-то вроде:

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

Чтобы быть более точным, я хочу проверить, что ||= применяется к var [: test].

Спасибо.

Ответы [ 3 ]

7 голосов
/ 01 марта 2011

Конструкция 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 голос
/ 01 марта 2011

Оператор :[]||= не существует.

var[:test] ||= value

- это просто сокращение для

var[:test] = var[:test] || value
0 голосов
/ 01 марта 2011

Не уверен насчет насмешек, но при условии, что код находится внутри метода:

def value
  @value ||= "value"
end

Вы можете просто вызвать его дважды и проверить, что оба объекта одинаковы:

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