Это утверждение означает:
Заглушите метод new
в классе Weather
с параметрами 'these'=>'params'
и верните значение выражения mock_weather(:save => true)
Аналогичный и, возможно, более понятный способ написать это будет:
Weather.stub(:new).with({'these'=>'params'}).and_return(mock_weather(:save => true))
Синтаксис {
<<code>some code> }
создает кодовый блок , который выполняется при вызове заглушки.
Возвращаемые значения двух форм .and_return()
и {}
немного отличаются; в первом случае это определяется при определении заглушки, во втором случае определяется при получении сообщения. Они обычно взаимозаменяемы - , но иногда не .
EDIT
Я чувствую этот ответ вводит в заблуждение насчет насмешек и заслуживает ответа:
Что касается вашего первого вопроса о том, "как
чтобы сделать это немного яснее ", мы могли бы
начать с использования не издевается. Издеваться
объект полезен когда не можешь
зависит от предсказуемого поведения
вторичный объект, объект, который является
не важно, но должно присутствовать в
ваш тестовый случай. Типичные примеры
использование макетов объектов базы данных
запросы, использование сети, файловый ввод / вывод. Вы
не хочу, чтобы ваши тесты провалились, потому что
ваш компьютер потерял соединение с сетью,
или база данных недоступна.
Правда, макеты могут устранить зависимости от внешних ресурсов, но это не единственная их цель. Настоящая ценность mocks заключается в том, что они позволяют вам писать тесты для кода, который еще не существует. Например, в Rails вы можете начать с написания спецификаций вида.
describe "posts/show.html.erb" do
it "displays the author name" do
assign(:post,mock('post',:author=>"Mark Twain"))
render
rendered.should contain("written by Mark Twain")
end
end
Эта спецификация не требует существования базы данных, контроллера или модели. Все, что он делает, это утверждает, что представление должно визуализировать строку и проверять, что она визуализируется - это все, что должно быть связано с представлением Rails. Единственными зависимостями являются наличие файла шаблона и переменной экземпляра @post
, которая обрабатывается оператором assign
. Его даже не волнует, что такое @post
, только то, что он отвечает на :author
.
Сгенерированный код, который вы получили от
рельсы г эшафот не оптимальны.
Сгенерированный код был сгенерирован в
способ пройти все тесты, и
для этого он использует фиктивные объекты. Я не
знаю, почему они это делают, я думаю,
лучше по умолчанию будет провал тестов
так что вам на самом деле нужно сделать
что-то, чтобы заставить их пройти.
Вся идея скаффолда состоит в том, чтобы сэкономить время, генерируя код, который работает для обычных случаев использования. Разве вы не хотите, чтобы сгенерированные тесты действительно работали?
Конечно, используя scaffolding, вы выполняете конечный прогон парадигмы BDD / TDD «test first», но, по-видимому, вы приняли соответствующие компромиссы, иначе вы не будете использовать скаффолды в первую очередь.
Что касается «зачем использовать фиктивные объекты», они позволяют отделить спецификацию контроллера от модели и базы данных. Так что да, это «оптимально», если вы знаете причину.
С автоматически генерируемыми фиктивными файлами вы
не нужно ничего делать вообще и
тесты продолжат проходить
навсегда. Это плохая идея и плохая
практика.
Они будут проходить только до тех пор, пока вы не нарушите предметный код. Таким образом, они имеют значение в регрессионном тестировании, чтобы гарантировать, что вы не вводите новый код или рефакторинг таким образом, что код больше не соответствует спецификациям.
Так как придётся писать
правила проверки в вашем файле модели,
и вы не используете фиктивный объект,
Вы можете быть уверены, что фактический
проверка продолжается.
Этот видсвязи на самом деле нежелательно в спецификации контроллера Rails. Контроллер должен знать как можно меньше о модели, поэтому спецификации контроллера должны определять только то, что происходит, когда валидация проходит (или не проходит) - и именно это делает макет, предоставляемый скаффолдом. Если вам необходимо проверить, является ли экземпляр модели действительным для данного набора параметров, сделайте это в спецификации модели.