3 Stimmen

RSpec Request Spec Testing Model Attribut

Ich habe die folgende Rspec-Datei:

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

Ein (von FactoryGirl erstellter) Benutzer kauft also etwas auf meiner Website.

En should create a stripe customer and save that to the stripe_customer_id of the user scheitert ( @user.stripe_customer_id est nil ).

Der Controller verfügt über diese Methode:

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

Ich weiß, dass der current_user (derselbe Benutzer aus FactoryGirl für die Tests) mit der stripe_customer_id weil die anderen Tests funktionieren.

Ich ging davon aus, dass ich das Modell irgendwie aktualisieren müsste, da ich direkt auf die Datenbank einwirkte (@user und current_user verweisen auf denselben Datenbankeintrag, sind aber nicht dasselbe Objekt). Also versuchte ich den Aufruf @user.reload bevor Sie prüfen, ob die stripe_customer_id war gleich Null, aber der Test schlug trotzdem fehl.

2 Fragen: Sollte ich überhaupt Modellattribute in einer Anforderungsspezifikation überprüfen? Und gibt es eine Möglichkeit, wie ich den fehlgeschlagenen Test zum Bestehen bringen kann?

Danke

1voto

Nash Bridges Punkte 2310

Wie ich sehe, verwenden Sie den Webkit-Treiber, also könnte das Problem in der Einrichtung der Transaktionen liegen. Haben Sie ausgeschaltet config.use_transactional_fixtures en spec_helper ? Siehe auch Wasserschwein Readme (Transaktionen und Datenbankeinrichtung)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X