Rails 3 / Capybara не сохраняет атрибуты модели - PullRequest
2 голосов
/ 05 июля 2011

Я пытаюсь запустить тест Capybara 1.0 в своем приложении на Rails 3, чтобы проверить, действительно ли пользователь нажимает на ссылку подтверждения. Он действительно подтверждается.

Теперь, на самом деле, это работает, когда я тестирую еговручную.Кроме того, как вы можете видеть, есть строка put @ user.confirmed, которую я вставил в метод подтверждения для отладки, и он действительно выводит true, когда я запускаю тест.Однако сам тест не пройден.

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

Чего мне не хватает?Большое спасибо заранее.

Тест:

it "should allow a user to be confirmed after clicking confirmation link" do
  fill_in('user_email', :with => 'test@test.com')
    click_button('Submit')
    @user = User.find_by_email('test@test.com')
    @user.confirmed.should be_false
    visit confirm_path(@user.confirmation_code)
    @user.confirmed.should be_true
end

Метод контроллера:

def confirm
    @confirmation_code = params[:confirmation_code]
    @user = User.find_by_confirmation_code(@confirmation_code)
    @website = @user.website
    @user.confirm
    if @user.referrer_id
        User.find(@user.referrer_id).increment_signups
    end
    flash[:success] = "Thanks for signing up!" 
    flash[:user_show] = @user.id
            puts @user.confirmed
    redirect_to "http://" + @website.domain_name
end

Метод пользовательской модели:

def confirm
    self.confirmed = true
    self.save
end

1 Ответ

4 голосов
/ 05 июля 2011

Это то, что вам нужно будет перезагрузить пользовательский объект после посещения verify_path?Попробуйте это:

it "should allow a user to be confirmed after clicking confirmation link" do
  fill_in('user_email', :with => 'test@test.com')
    click_button('Submit')
    @user = User.find_by_email('test@test.com')
    @user.confirmed.should be_false
    visit confirm_path(@user.confirmation_code)
    @user = User.find_by_email('test@test.com')
    @user.confirmed.should be_true
end

В качестве альтернативы вы можете использовать @user.reload.

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

...