2012-03-30 1 views
1

Ich verwende Gurke mit Watir Web-Browser, um Tests zu automatisieren. Ich verwende Watir, um ein Webformular auszufüllen, das ein Modell in meiner Datenbank speichert. Wenn ich jedoch versuche, mit ActiveRecord zu bestätigen, dass der Datensatz vorhanden ist, gibt meine Suche keine Ergebnisse zurück. Ich nehme an, ich könnte Watir benutzen, um jeden Schritt meiner Tests zu automatisieren, aber in Zukunft wird meine Testsuite SEHR langsam laufen.Beim Ausführen von Rake: Gurke ActiveRecord Modelle können nicht auf die gleiche Datenbank zugreifen wie App

Meine Funktion:

Feature: Creating a campaign 

As someone with too much time on my hands 
I want to create a campaign 
So that I can monitor my roleplaying campaigns 

Scenario: Adding a Campaign 
    Given I am at the site 
    When I create a campaign "The Hills" with a setting "Cali" 
    Then the campaign should persist in the system 

Mein Schritt Definitionen:

Given /^I create a campaign "([^"]*)" with a setting "([^"]*)"$/ do |name, setting| 
    @browser.text_field(:id => "campaign_campaign_name").set name 
    @browser.text_field(:id => "campaign_setting").set setting 
    @browser.button(:value => "Create Campaign").click 
    @campaign_name = name 
    @setting = setting 
end 

Then /^the campaign should persist in the system$/ do 
    @browser.text.should =~ /#{@campaign_name}/ 
    @browser.text.should =~ /#{@setting}/ 
    @database_campaign = Campaign.where(:campaign_name => @campaign_name)[0] 
    @database_campaign.campaign_name.should == @campaign_name 
end 

HINWEIS: Ich habe versucht, explizit eine Verbindung zu meiner Testdatenbank Festlegung, aber das hat nicht funktioniert entweder. Ich habe eine Ruby-Datei in das Support-Verzeichnis geschrieben, das folgendes enthält:

def establish_connection_to_test_database 
    begin 
    ActiveRecord::Base.establish_connection :test 
    rescue 
    raise "You have not established a connection to the test database" 
    end 
end 

establish_connection_to_test_database 

Antwort

1

ActiveRecord verwendet Verbindungspools, damit verschiedene Threads auf dieselbe Datenbank zugreifen können. Die Verbindung zur selben Datenbank ist hier wahrscheinlich nicht das Problem. Es ist sehr wahrscheinlich, dass Ihr Bestätigungsschritt zu schnell abläuft und die Web-Transaktion noch nicht abgeschlossen ist, was zu einer Wettlaufsituation führt. Sie können dies testen, indem Sie einen sleep Anruf in Ihrem Prüfungsschritt setzen:

Then /^the campaign should persist in the system$/ do 
    sleep 1.0 

    @browser.text.should =~ /#{@campaign_name}/ 
    @browser.text.should =~ /#{@setting}/ 
    @database_campaign = Campaign.where(:campaign_name => @campaign_name)[0] 
    @database_campaign.campaign_name.should == @campaign_name 
end 

Das heißt, Sie zwei getrennte Dinge im gleichen Schritt testen: Text auf der Seite, und dass die Daten an die Datenbank beibehalten (was auch redundant gemacht wird).

Ich empfehle die Datenbank-Überprüfung zu vermeiden, es sei denn, Sie glauben, dass es absolut notwendig ist, die auch die Race-Bedingung beheben sollte.

Then /^the campaign should persist in the system$/ do 
    @browser.text.should include(@campaign_name) 
    @browser.text.should include(@setting) 
end 
+0

Danke für den Vorschlag, ich werde versuchen zu sehen, ob der Schlaf hilft. Um ehrlich zu sein, setze ich diese direkte Modellzugriffsassoziation hier nur als Beispiel, ich möchte ActiveRecord wirklich für Schritt-Setup und Teardown mehr als Testverhalten verwenden. Ich stimme zu, dass Datenbankzugriffsprüfungen nicht die beste Wahl für Integrationstests sind. –

Verwandte Themen