Контроллер Spec с и без лямбды + "должен измениться" - PullRequest
0 голосов
/ 22 июля 2010

Я тестирую простое действие по сбросу пароля и хотел бы, чтобы RSpec соответствовал "изменению" для лямбд.Но это не работает для этого действия контроллера.Все отлично работает без этого соответствия.Вот спецификация:

  describe "#update" do
it "Updates the password and resets the token" do
  @user = Factory :user
  getter = lambda{
    get :edit, :id => @user.perishable_token, :user => {:password_confirmation => "new_password",
                                                      :password => "new_password"}
    @user.reload
  }
  getter.should change(@user, :password)
  getter.should change(@user, :perishable_token)
end

it "Updates the password and resets the token" do
  @user = Factory :user
  old_password = @user.password
  old_token = @user.perishable_token
  get :edit, :id => @user.perishable_token, :user => {:password_confirmation => "new_password",
                                                      :password => "new_password"}        
  @user.reload.password.should != old_password
  @user.perishable_token.should != old_token
end
end

Второй it-блок работает, первый нет.Я попытался напечатать значения внутри лямбды, и они действительно не изменились.

Большое спасибо за любые идеи по этому вопросу!

Ответы [ 2 ]

0 голосов
/ 24 июля 2010

Итак, выясняется, что Change-matcher вызывает proc.Так что это не проблема.Тем не менее, я звонил Редактировать, а не Обновлять.Так что ничего не должно было измениться.Кроме того, Пароль существует только для объектов пользователя, для которых пароль был только что установлен и не был получен из БД, поскольку пароль в открытом виде не сохраняется.Вот теперь работающий код:

describe "#update" do
it "Updates the password and resets the token" do
  @user = Factory.create :user
  getter = lambda{
    post :update, :id => @user.perishable_token, :user => {:password_confirmation => "new_password",
                                                            :password => "new_password"}
    @user.reload
  }
  getter.should change(@user, :crypted_password)
  getter.should change(@user, :perishable_token)
end
end

Я думал, что это окажется глупой ошибкой, но два в одном ...

0 голосов
/ 22 июля 2010

Вам нужно использовать call для фактического выполнения лямбды в вашем первом примере. Вы назначаете лямбду на getter, но никогда не делаете getter.call, чтобы фактически выполнить лямбду и получить свой результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...