Почему ты не можешь прямо заглушить! макет объектов? - PullRequest
3 голосов
/ 13 января 2011

Я мог бы упустить что-то совершенно очевидное здесь, но зачем мне это делать:

setup do
  @person = mock("person")
  @person.stub!(:name).and_return("david")
end

Вместо

@person = mock("person").stub!(:name).and_return("david")

Что возвращает макет ("строка")что не позволяет его заглушить, а не @person?Разве mock не возвращает объект (возможно, просто модифицирует некоторую внутреннюю хеш-таблицу mock'ed-функций и затем возвращает отдельный объект?

Ответы [ 2 ]

3 голосов
/ 13 января 2011

Как указывает Питер , @person присваивается значение из and_return, а не фиктивный объект.Это оказывается Proc.

. Вы можете сделать это:

@person = mock("person").tap {|obj| obj.stub!(:name).and_return("david") }

Хотя все это не нужно, поскольку вы можете объявить заглушку прямо в определении макета:

@person = mock("person", :name => "david")
3 голосов
/ 13 января 2011

Поскольку вызов and_return не возвращает объект-заглушку. mock делает.

Во-первых, чтобы иметь фиктивный объект для работы, вы должны создать реальный фиктивный объект и назначить его переменной. При вызове mock("person").stub!... фиктивный объект теряется в цепочке вызовов. Ваша связанная версия будет работать, только если and_return вернет исходный фиктивный объект.

...