2013-01-16 8 views
7

Sono nuovo di cetriolo e sto imparando BDDerrori di SQL non può iniziare una transazione all'interno di una transazione durante il test con cetriolo

Quando sto cercando di riempire un modulo e creare un record viene mostrato questo errore SQLite , anche se non c'è nessun errore quando ho provato il codice manualmente nel mio browser.

sto usando le rotaie 4.

Ecco il mio codice di controllo

class Admin::ItemsController < ApplicationController 
    def index 
     @items=Item.all 
    end 

    def new 
     @item=Item.new 
    end 

    def create 
     @item=Item.new items_params 
      respond_to do |format| 
       if @item.save 
        format.html { redirect_to admin_items_path } 
       else 
        format.html { redirect_to new_admin_items_path } 
       end 
      end 
    end 

private 
    def items_params 
     params.require(:item).permit(:name,:price)  
    end 
end 

Ecco il mio file di Caratteristica

Feature: Manage Items 
    In order to make a store 
    As an admin 
    I want to create and manage items 

    Scenario: Items List 
    Given I go to the new admin item page 
    And I fill in "Name" with "Shampoo" 
    And I fill in "Price" with "50" 
    When I press "Create" 
    Then I should be on the admin items page 
    And I should see "Shampoo" 

e definizioni step

require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "paths")) 

Given /^I go to the (.+)$/ do |page_name| 
    visit path_to(page_name) 
end 

And /^I fill in "([^\"]*)" with "([^\"]*)"$/ do |field, value| 
    fill_in(field.gsub(' ', '_'), :with => value) 
end 

When /^I press "([^\"]*)"$/ do |button| 
    click_button(button) 
end 

Then /^I should be on the (.+)$/ do |page_name| 
    current_path.should == path_to(page_name) 
end 

And /^I should see "(.*?)"$/ do |arg1| 
    page.should have_content(arg1) 
end 

Questo l'errore è sh proprio nel passaggio 4, cioè quando viene fatto clic sul pulsante di creazione e quando viene richiamato l'elemento # create.

Non so cosa c'è di sbagliato nel codice, sperando che qualcuno possa aiutare.

UPDATE:

Credo che il problema è con una deprecazione in cetriolo-rails https://github.com/cucumber/cucumber-rails/issues/231

traccia completa:

Using the default profile... 
WARNING: Nokogiri was built against LibXML version 2.7.8, but has dynamically loaded 2.9.0 
DEPRECATION WARNING: ActionController::Integration is deprecated and will be removed, use ActionDispatch::Integration instead. (called from <module:Rails> at /home/phanindra/.gem/ruby/1.9.1/gems/cucumber-rails-1.3.0/lib/cucumber/rails/world.rb:9) 
DEPRECATION WARNING: ActionController::IntegrationTest is deprecated and will be removed, use ActionDispatch::IntegrationTest instead. (called from <module:Rails> at /home/phanindra/.gem/ruby/1.9.1/gems/cucumber-rails-1.3.0/lib/cucumber/rails/world.rb:9) 
Feature: Manage Items 
    In order to make a store 
    As an admin 
    I want to create and manage items 

    Scenario: Items List      # features/manage_items.feature:6 
DEPRECATION WARNING: #increment_open_transactions is deprecated and has no effect. (called from start at /home/phanindra/.gem/ruby/1.9.1/gems/database_cleaner-0.9.1/lib/database_cleaner/active_record/transaction.rb:11) 
    Given I go to the new admin item page # features/step_definitions/item_steps.rb:3 
    And I fill in "Name" with "Shampoo"  # features/step_definitions/item_steps.rb:7 
    And I fill in "Price" with "50"   # features/step_definitions/item_steps.rb:7 
    When I press "Create"     # features/step_definitions/item_steps.rb:11 
     SQLite3::SQLException: cannot start a transaction within a transaction: begin transaction (ActiveRecord::StatementInvalid) 
     /home/phanindra/rails/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb:353:in `block in begin_db_transaction' 
     /home/phanindra/rails/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:305:in `block in log' 
     /home/phanindra/rails/activesupport/lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
     /home/phanindra/rails/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:300:in `log' 
     /home/phanindra/rails/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb:353:in `begin_db_transaction' 
     /home/phanindra/rails/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb:129:in `initialize' 
     /home/phanindra/rails/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb:17:in `new' 
     /home/phanindra/rails/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb:17:in `begin' 
     /home/phanindra/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:231:in `begin_transaction' 
     /home/phanindra/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:208:in `within_new_transaction' 
     /home/phanindra/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:201:in `transaction' 
     /home/phanindra/rails/activerecord/lib/active_record/transactions.rb:209:in `transaction' 
     /home/phanindra/rails/activerecord/lib/active_record/transactions.rb:319:in `with_transaction_returning_status' 
     /home/phanindra/rails/activerecord/lib/active_record/transactions.rb:269:in `block in save' 
     /home/phanindra/rails/activerecord/lib/active_record/transactions.rb:280:in `rollback_active_record_state!' 
     /home/phanindra/rails/activerecord/lib/active_record/transactions.rb:268:in `save' 
     /home/phanindra/rails/activerecord/lib/active_record/persistence.rb:37:in `create' 
     ./app/controllers/admin/items_controller.rb:11:in `create' 
     /home/phanindra/rails/actionpack/lib/action_controller/metal/implicit_render.rb:4:in `send_action' 
     /home/phanindra/rails/actionpack/lib/abstract_controller/base.rb:189:in `process_action' 
     /home/phanindra/rails/actionpack/lib/action_controller/metal/rendering.rb:10:in `process_action' 
     /home/phanindra/rails/actionpack/lib/abstract_controller/callbacks.rb:18:in `block in process_action' 
     /home/phanindra/rails/activesupport/lib/active_support/callbacks.rb:393:in `_run__143383953690284082__process_action__callbacks' 
     /home/phanindra/rails/activesupport/lib/active_support/callbacks.rb:78:in `run_callbacks' 
     /home/phanindra/rails/actionpack/lib/abstract_controller/callbacks.rb:17:in `process_action' 
     /home/phanindra/rails/actionpack/lib/action_controller/metal/rescue.rb:29:in `process_action' 
     /home/phanindra/rails/actionpack/lib/action_controller/metal/instrumentation.rb:31:in `block in process_action' 
     /home/phanindra/rails/activesupport/lib/active_support/notifications.rb:158:in `block in instrument' 
     /home/phanindra/rails/activesupport/lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
     /home/phanindra/rails/activesupport/lib/active_support/notifications.rb:158:in `instrument' 
     /home/phanindra/rails/actionpack/lib/action_controller/metal/instrumentation.rb:30:in `process_action' 
     /home/phanindra/rails/actionpack/lib/action_controller/metal/params_wrapper.rb:245:in `process_action' 
     /home/phanindra/rails/activerecord/lib/active_record/railties/controller_runtime.rb:18:in `process_action' 
     /home/phanindra/rails/actionpack/lib/abstract_controller/base.rb:136:in `process' 
     /home/phanindra/rails/actionpack/lib/abstract_controller/rendering.rb:44:in `process' 
     /home/phanindra/rails/actionpack/lib/action_controller/metal.rb:195:in `dispatch' 
     /home/phanindra/rails/actionpack/lib/action_controller/metal/rack_delegation.rb:13:in `dispatch' 
     /home/phanindra/rails/actionpack/lib/action_controller/metal.rb:231:in `block in action' 
     /home/phanindra/rails/actionpack/lib/action_dispatch/routing/route_set.rb:77:in `call' 
     /home/phanindra/rails/actionpack/lib/action_dispatch/routing/route_set.rb:77:in `dispatch' 
     /home/phanindra/rails/actionpack/lib/action_dispatch/routing/route_set.rb:45:in `call' 
     /home/phanindra/rails/actionpack/lib/action_dispatch/journey/router.rb:69:in `block in call' 
     /home/phanindra/rails/actionpack/lib/action_dispatch/journey/router.rb:57:in `each' 
     /home/phanindra/rails/actionpack/lib/action_dispatch/journey/router.rb:57:in `call' 
     /home/phanindra/rails/actionpack/lib/action_dispatch/routing/route_set.rb:614:in `call' 
     /home/phanindra/rails/actionpack/lib/action_dispatch/middleware/best_standards_support.rb:17:in `call' 
     /home/phanindra/rails/actionpack/lib/action_dispatch/middleware/params_parser.rb:30:in `call' 
     /home/phanindra/rails/actionpack/lib/action_dispatch/middleware/flash.rb:233:in `call' 
     /home/phanindra/rails/actionpack/lib/action_dispatch/middleware/cookies.rb:443:in `call' 
     /home/phanindra/rails/activerecord/lib/active_record/query_cache.rb:36:in `call' 
     /home/phanindra/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:632:in `call' 
     /home/phanindra/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:29:in `block in call' 
     /home/phanindra/rails/activesupport/lib/active_support/callbacks.rb:373:in `_run__2084705409073281596__call__callbacks' 
     /home/phanindra/rails/activesupport/lib/active_support/callbacks.rb:78:in `run_callbacks' 
     /home/phanindra/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:27:in `call' 
     /home/phanindra/rails/actionpack/lib/action_dispatch/middleware/remote_ip.rb:76:in `call' 
     /home/phanindra/rails/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb:18:in `call' 
     /home/phanindra/rails/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:31:in `call' 
     /home/phanindra/rails/railties/lib/rails/rack/logger.rb:32:in `call_app' 
     /home/phanindra/rails/railties/lib/rails/rack/logger.rb:16:in `block in call' 
     /home/phanindra/rails/activesupport/lib/active_support/tagged_logging.rb:67:in `block in tagged' 
     /home/phanindra/rails/activesupport/lib/active_support/tagged_logging.rb:25:in `tagged' 
     /home/phanindra/rails/activesupport/lib/active_support/tagged_logging.rb:67:in `tagged' 
     /home/phanindra/rails/railties/lib/rails/rack/logger.rb:16:in `call' 
     /home/phanindra/rails/actionpack/lib/action_dispatch/middleware/request_id.rb:21:in `call' 
     /home/phanindra/rails/activesupport/lib/active_support/cache/strategy/local_cache.rb:72:in `call' 
     /home/phanindra/rails/actionpack/lib/action_dispatch/middleware/static.rb:63:in `call' 
     /home/phanindra/rails/railties/lib/rails/engine.rb:508:in `call' 
     /home/phanindra/rails/railties/lib/rails/application.rb:95:in `call' 
     ./features/step_definitions/item_steps.rb:12:in `/^I press "([^\"]*)"$/' 
     features/manage_items.feature:10:in `When I press "Create"' 
    Then I should be on the admin items page # features/step_definitions/item_steps.rb:15 
    And I should see "Shampoo"    # features/step_definitions/item_steps.rb:19 

Failing Scenarios: 
cucumber features/manage_items.feature:6 # Scenario: Items List 

1 scenario (1 failed) 
6 steps (1 failed, 2 skipped, 3 passed) 
0m3.476s 
+0

L'aggiornamento ha risolto il problema? Se è così, per favore rispondi alla tua stessa domanda! Inoltre, si prega di fornire l'errore completo che si sta ricevendo, possibilmente con una traccia dello stack? – Dan

+0

no non ha risolto il problema – pahnin

risposta

5

Sembra che si sta utilizzando DatabaseCleaner, che per impostazione predefinita, esegue ciascuna delle tue funzionalità in una transazione. Nel frattempo, ActiveRecord stesso avvia una transazione quando salva l'oggetto. Sfortunatamente, SQLite non supporta le transazioni nidificate.

Se si change your DatabaseCleaner strategy a :truncation si dovrebbe evitare questo errore. In alternativa, è possibile testare un database più efficiente come PostgreSQL.

+0

Grazie per la tua risposta, ma ora sto ricevendo questo errore, quindi non posso davvero ora se cambiando stratagemma database_cleaner funziona! :( – pahnin

+0

Spiacente, qual è il nuovo errore che si ottiene? Le avvertenze di deprecazione non dovrebbero smettere di creare un record, sono solo avvertimenti, non errori. –

+0

questo https://github.com/bmabey/database_cleaner/pull/153 – pahnin

3

Questo ha funzionato per me. Modifica il tuo Gemfile per estrarre dall'ultima fonte su github, come suggeriva Andy H.

gem 'database_cleaner', github: 'bmabey/database_cleaner' 
Problemi correlati