Wie führe ich die Rails-Konsole in der Testumgebung aus und lade test_helper.rb?


121

Der Hintergrund: Ich habe einige Probleme mit Thoughtbots "Factory Girl" -Edelstein, mit dem Objekte erstellt werden, die in Einheiten- und anderen Tests verwendet werden sollen. Ich möchte zur Konsole gehen und verschiedene Factory Girl-Anrufe ausführen, um herauszufinden, was passiert. Zum Beispiel würde ich gerne da reingehen ...

>> Factory(:user).inspect

Ich weiß, dass Sie die Konsole in verschiedenen Umgebungen ausführen können ...

$ script / console RAILS_ENV = test

Aber wenn ich das mache, ist die Factory-Klasse nicht verfügbar. Es sieht so aus, als würde test_helper.rbes nicht geladen.

Ich habe verschiedene requireAnrufe ausprobiert, darunter einen mit dem absoluten Pfad zu, test_helper.rbaber sie schlagen ähnlich fehl:

$ script/console RAILS_ENV=test
>> require '/Users/ethan/project/contactdb/test/test_helper.rb'
  Errno::ENOENT: No such file or directory - 
  /Users/ethan/project/contactdb/config/environments/RAILS_ENV=test.rb

Grr. Argh.


1
Wenn Sie also den RAILS_ENV = -Test vor das Skript / die Konsole gestellt hätten, hätte dies wie erwartet funktioniert.
Jared

Antworten:


192

Für Schienen <3.0

Ausführen script/console --help. Sie werden feststellen, dass die Syntax script/console [environment]wie in Ihrem Fall lautet script/console test.

Ich bin nicht sicher, ob Sie den Testhelfer benötigen oder ob die Testumgebung dies für Sie erledigt, aber mit diesem Befehl sollten Sie zumindest in der Lage sein, die Testumgebung erfolgreich zu starten.

Als Nebenbemerkung: Es ist in der Tat seltsam, dass die verschiedenen Binärdateien im Skript / unterschiedliche Möglichkeiten zum Festlegen der Rails-Umgebung haben.

Für Schienen 3 und 4

Ausführen rails c test. Stellen bundle execSie vor, wenn Sie dies für die aktuelle App-Umgebung benötigen.

Für Schienen 5 und 6

Ausführen rails console -e test.


63
In Schienen 3 ist es nurrails console [environment]
Idris Mokhtarzada

26
Es ist ein wenig inkonsistent, weil, um den Server zu starten, den Sie eingebenrails server -e test
Jason

In Rails 5 funktioniert dies immer noch. Und Sie müssen mindestens einige Teile Ihrer Umgebung laden - in meinem Fall features/support/helpers.rbwurde sie nicht automatisch geladen. Auch Rack::Testist nicht geladen.
Derrell Durrett

61

Tun Sie in Rails 3 einfach rails console testoder rails console productionoder rails console development(was die Standardeinstellung ist).



8

Für Rails 5.2.0: "Die Übergabe des Umgebungsnamens als reguläres Argument ist veraltet und wird in der nächsten Rails-Version entfernt. Verwenden Sie stattdessen die Option -e."

rails c -e test

4

Sie können die Umgebung angeben, in der der Konsolenbefehl ausgeführt werden soll.

rails c [environment]

Beispiele

1) Für die Inszenierung

rails c staging

2) Für die Produktion

rails c production

Für Quelle und detaillierte Beschreibung: Die Rails-Befehlszeile


3

David Smith ist richtig, tun Sie es einfach

script/console test

Der Hilfebefehl zeigt, warum dies funktioniert:

$ script/console -h
Usage: console [environment] [options]
    -s, --sandbox                    Rollback database modifications on exit.
        --irb=[irb]                  Invoke a different irb.
        --debugger                   Enable ruby-debugging for the console.

Es ist das [Umwelt-] Bit.


2

Ich teile den Schmerz des Fragestellers. Hier gibt es wirklich drei verschiedene Fragen, von denen einige angesprochen werden, andere nicht:

  1. Wie starte ich die Konsole in der Testumgebung?

    Für neuere Rails-Versionen bundle exec rails c testoder alternative Syntaxen dafür.

  2. Wie stellen Sie sicher, dass test / test_helper.rb in diese Konsolensitzung geladen wird?

    So etwas require './test/test_helper'sollte es tun.

    Für mich gibt dies true zurück, was darauf hinweist, dass es beim Starten der Konsole noch nicht geladen war. Wenn diese Anweisung false zurückgibt, haben Sie nur ein paar Tastenanschläge verschwendet, aber Sie können trotzdem loslegen.

  3. Wie rufen Sie nach dem Laden von test_helper die darin definierten Methoden auf?

    In einem typischen test_helper werden die benutzerdefinierten Methoden normalerweise als Instanzmethoden von ActiveSupport :: TestCase definiert. Wenn Sie also einen von ihnen aufrufen möchten, benötigen Sie eine Instanz dieser Klasse. ActiveSupport :: TestCase.new hat durch Ausprobieren einen erforderlichen Parameter, also ... übergeben Sie ihm etwas.

    Wenn Ihr test_helper eine Methode namens create_user hat, können Sie diese folgendermaßen aufrufen: ActiveSupport::TestCase.new("no idea what this is for").create_user


Anstatt Versuch oder Fehler - verwenden die API Führungsschienen , was zu finden , es braucht api.rubyonrails.org/classes/ActiveSupport/TestCase.html ... es ist wahrscheinlich Prüfauftrag das ist :randomstandardmäßig
Mirv - Matt

Es gibt nur diese beiden Klassenmethoden, die für ActiveSupport :: TestCase beschrieben wurden. Daher ist mir nicht klar, von welcher Klasse / welchem ​​Modul die initializeMethode geerbt wird . Es sieht jedoch so aus, als würde der erwartete Parameter wie @NAMEauf dem erstellten Objekt gespeichert .
Nick Davies

1

Stellen Sie sicher, dass Sie das GEM installiert und die folgende Zeile entweder in Ihrer Datei environment.rb oder test.rb hinzugefügt haben.

config.gem "thoughtbot-factory_girl", :lib => "factory_girl", :source => "http://gems.github.com"

0

Test Env

rails console test # or just rails c test

Entwicklung Env

rails console # or just rails c

0

Befehl zum Ausführen der Rails-Konsolentestumgebung lautet

rails c -e test

oder

RAILS_ENV=test rails c

wenn Sie vor einem Problem stehen

ActiveRecord::StatementInvalid:
   Mysql2::Error: Table 'DB_test.users' doesn't exist: SHOW FULL FIELDS FROM `users`

Dann sollten Sie zuerst Ihre Test-DB vorbereiten, indem Sie ausführen

bundle exec rake db:test:prepare
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.