Я думаю, что есть некоторая путаница, когда речь идет о заглушках и ожиданиях сообщения . Ожидаемые сообщения - это, в основном, заглушки, в которых вы можете задать желаемый постоянный ответ, но они также проверяют вызов, который будет выполнен тестируемым кодом. В отличие от заглушек, это просто готовые ответы на вызовы методов. Но не смешивайте заглушку с ожидаемым сообщением по тому же методу и тесту, иначе случится что-то плохое ...
Возвращаясь к вашему вопросу, есть две (или более?), Которые требуют уточнения здесь:
- То, что CustomersController вызывает
Customer#active_customers
, когда вы делаете get
на index
. Не имеет значения, что Customer#active_customers
возвращает в этой спецификации.
- То, что
active_customers
named_scope действительно возвращает клиентов, где поле active
равно true
.
Я думаю, что вы пытаетесь сделать номер 1. Если это так, удалите всю заглушку и просто установите ожидание сообщения в вашем тесте:
describe CustomersController do
it "should be successful and call Customer#active_customers" do
Customer.should_receive(:active_customers)
get :index
response.should be_success
end
end
В приведенной выше спецификации вы не проверяете, что он возвращает. Это нормально, так как это цель спецификации (хотя ваша спецификация слишком близка к реализации, а не к поведению, но это другая тема). Если вы хотите, чтобы вызов active_customers
возвратил что-то конкретное, добавьте .and_returns(@whatever)
к ожидаемому сообщению. Другая часть истории состоит в том, чтобы проверить, что active_customers
работает должным образом (то есть: спецификация модели, которая делает фактический вызов БД).