Атрибут модели тестирования спецификации запроса RSpec - PullRequest
3 голосов
/ 21 марта 2012

У меня есть следующий файл Rspec:

describe "Cart" do
  before do
    @user = FactoryGirl.create(:user)
    @cart = @user.carts.create!
  end

describe "using stripe" do
  before do
    @sport = FactoryGirl.create(:sport)
  end

  describe "user adds sport to cart" do
    before do
      visit sports_path
      click_link "Add to Cart"
    end

    it "should be checkout page" do
      page.should have_content("Total")
    end

    describe "user clicks checkout" do
      before do
        click_button "Checkout"
      end

      it "should redirect user to sign in form" do
        page.should have_selector('h2', text: "Sign in")
      end

      describe "user logs on" do
        before do
          fill_in "Email", with: @user.email
          fill_in "Password", with: @user.password
          click_button "Sign in"
        end

        it "should be on checkout page" do
          page.should have_selector('h2', text: "Checkout")
        end

        describe "user fills in form", js: true, driver: :webkit do

          describe "everything valid" do
            before do
              fill_in "card-number", with: 4242424242424242
              fill_in "card-expiry-month", with: 12
              fill_in "card-expiry-year", with: 2015
              fill_in "card-cvc", with: 123
              click_button "Submit Payment"
            end

            it "should redirect to confirmation page" do
              page.should have_content("Confirmation")
            end

            it "should have the total price listed" do
              page.should have_content(@cart.total_price)
            end

            it "should create a stripe customer and save that to the stripe_customer_id of the user" do
              @user.stripe_customer_id.should_not be_nil
            end

            describe "should allow user authorize charge" do
              before do
                click_button "Confirm and Purchase"
              end

              it "should be back to sports page" do
                page.should have_content("Select a Sport")
              end
            end


          end
        end
      end
    end
  end
end

Таким образом, пользователь (созданный FactoryGirl) покупает что-то на моем сайте.

Ошибка should create a stripe customer and save that to the stripe_customer_id of the user (@user.stripe_customer_id - nil).

Контроллер имеет этот метод:

def confirmation
  @cart = current_cart
  customer = Stripe::Customer.create(description: current_user.email, card: params[:stripeToken])
  current_user.update_attributes(stripe_customer_id: customer.id)
end

Я знаю, что current_user (тот же пользователь из FactoryGirl для тестов) обновляется с помощью stripe_customer_id, потому что другие тесты работают.

Я предполагал, что мне придется каким-то образом обновить модель, потому что я напрямую воздействовал на базу данных (@user и current_user ссылаются на одну и ту же запись в БД, но не являются одним и тем же объектом). Поэтому я попытался дозвониться до @user.reload, прежде чем проверять, равнялся ли stripe_customer_id нулю, но тест все равно не удался.

2 вопроса: Должен ли я даже проверять атрибуты модели в спецификации запроса? И есть ли способ, как я могу пройти неудачный тест?

Спасибо

1 Ответ

1 голос
/ 29 марта 2012

Я вижу, что вы используете драйвер webkit, поэтому проблема может быть в настройке транзакций. Вы выключили config.use_transactional_fixtures в spec_helper? См. Также Readme Capybara (Транзакции и настройка базы данных)

...