Вместо того, чтобы издеваться над подпиской, попробуйте заглушить методы действительной подписки:
subscription = Subscription.new
subscription.stub!(:item_shipped!)
subscription.stub!(:user_id)
@user.subscription = subscription
Муки могут быть хрупкими.Любой призыв к издевательству должен быть предвиден и объявлен как ожидание.Похоже, что этому конкретному тесту в любом случае не нужна эта модель.
РЕДАКТИРОВАТЬ: Также не забудьте объявить любые возвращаемые значения, от которых зависит вызывающий класс.В вашем случае это может выглядеть так:
subscription.stub!(:item_shipped!).and_return(true)
subscription.stub!(:user_id).and_return(@user.id)
и т. Д.
Опять же, если вы не утверждаете, что должен быть вызван метод в вашей моделируемой модели, то единственное, что делает mockingвот сделай свой тест хрупким.Мок предназначен для таких вещей, как:
subscription.should_receive(:some_method).once
В противном случае вам просто нужно заглушить методы, которые имеют нежелательные побочные эффекты, которые не касаются вашей спецификации.