จะรัน Rails console ในสภาพแวดล้อมการทดสอบและโหลด test_helper.rb ได้อย่างไร?


121

พื้นหลัง: ฉันมีปัญหาบางอย่างกับอัญมณี "Factory Girl" ของ Thoughtbot ซึ่งใช้ในการสร้างวัตถุเพื่อใช้ในหน่วยและการทดสอบอื่น ๆ ฉันต้องการไปที่คอนโซลและเรียกใช้ Factory Girl ที่แตกต่างกันเพื่อตรวจสอบว่าเกิดอะไรขึ้น ตัวอย่างเช่นฉันอยากไปที่นั่นทำ ...

>> Factory(:user).inspect

ฉันรู้ว่าคุณสามารถเรียกใช้คอนโซลในสภาพแวดล้อมที่แตกต่างกัน ...

$ script / console RAILS_ENV = test

แต่เมื่อฉันทำเช่นนั้นคลาสโรงงานจะไม่สามารถใช้ได้ ดูเหมือนว่าจะtest_helper.rbไม่ได้รับการโหลด

ฉันลองrequireโทรหลายครั้งรวมถึงหนึ่งสายที่มีเส้นทางสัมบูรณ์test_helper.rbแต่ก็ล้มเหลวในทำนองนี้:

$ 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 โอ๊ะ


1
ดังนั้นหากคุณวางการทดสอบ RAILS_ENV = ก่อนสคริปต์ / คอนโซลมันจะทำงานได้ตามที่คุณคาดหวัง
Jared

คำตอบ:


192

สำหรับ Rails <3.0

script/console --helpวิ่ง คุณจะสังเกตเห็นว่าไวยากรณ์คืออะไรscript/console [environment]ซึ่งในกรณีของคุณคือscript/console testซึ่งในกรณีของคุณคือ

ฉันไม่แน่ใจว่าคุณต้องต้องการผู้ช่วยทดสอบหรือว่าสภาพแวดล้อมการทดสอบทำเพื่อคุณ แต่ด้วยคำสั่งนั้นอย่างน้อยคุณควรจะสามารถบูตเข้าสู่ env การทดสอบได้สำเร็จ

ในฐานะที่เป็นแนวทาง: เป็นเรื่องแปลกที่ไบนารีต่างๆในสคริปต์ / มีวิธีการตั้งค่าสภาพแวดล้อมรางที่แตกต่างกัน

สำหรับ Rails 3 และ 4

rails c testวิ่ง นำหน้าbundle execหากคุณต้องการสิ่งนี้สำหรับสภาพแวดล้อมของแอปปัจจุบัน

สำหรับ Rails 5 และ 6

rails console -e testวิ่ง


63
ในราง 3 เพียงrails console [environment]
Idris Mokhtarzada

26
มันไม่สอดคล้องกันเล็กน้อยเนื่องจากการเริ่มต้นเซิร์ฟเวอร์ที่คุณพิมพ์rails server -e test
Jason

ใน Rails 5 ยังคงใช้งานได้ และคุณต้องโหลดอย่างน้อยบางส่วนในสภาพแวดล้อมของคุณ - ในกรณีของฉันfeatures/support/helpers.rbไม่ได้โหลดโดยอัตโนมัติ ยังRack::Testไม่โหลด
Derrell Durrett

61

ใน Rails 3 ให้ทำrails console testหรือrails console productionหรือrails console development(ซึ่งเป็นค่าเริ่มต้น)



8

สำหรับ Rails 5.2.0: "การส่งผ่านชื่อของสภาพแวดล้อมเป็นอาร์กิวเมนต์ปกติจะถูกเลิกใช้และจะถูกลบออกใน Rails เวอร์ชันถัดไปโปรดใช้ตัวเลือก -e แทน"

rails c -e test

4

คุณสามารถระบุสภาพแวดล้อมที่คำสั่งคอนโซลควรทำงาน

rails c [environment]

ตัวอย่าง

1) สำหรับการจัดเตรียม

rails c staging

2) สำหรับการผลิต

rails c production

สำหรับแหล่งที่มาและคำอธิบายโดยละเอียด: Rails Command Line


3

เดวิดสมิ ธ ถูกต้องเพียงแค่ทำ

script/console test

คำสั่ง help จะแสดงว่าเหตุใดจึงได้ผล:

$ 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.

มันคือบิต[สิ่งแวดล้อม]


2

ฉันแบ่งปันความเจ็บปวดของผู้ถาม มีคำถามสามข้อแยกกันอยู่ที่นี่ซึ่งบางคำถามได้รับการตอบกลับบางคำถามไม่ใช่:

  1. คุณเริ่มคอนโซลในสภาพแวดล้อมการทดสอบได้อย่างไร?

    สำหรับ Rails เวอร์ชันล่าสุดbundle exec rails c testหรือไวยากรณ์ทางเลือกสำหรับสิ่งนั้น

  2. คุณแน่ใจได้อย่างไรว่า test / test_helper.rb ถูกโหลดลงในเซสชันคอนโซลนั้น

    สิ่งที่require './test/test_helper'ควรทำ

    สำหรับฉันสิ่งนี้ส่งคืนจริงซึ่งแสดงว่ายังไม่ได้โหลดเมื่อฉันเริ่มคอนโซล หากคำสั่งนั้นส่งคืนเป็นเท็จแสดงว่าคุณเสียเวลาเพียงไม่กี่ครั้งในการกดแป้นพิมพ์ แต่คุณก็ยังดีที่จะไป

  3. เมื่อโหลด test_helper แล้วคุณจะเรียกวิธีการที่กำหนดไว้ในนั้นได้อย่างไร

    ใน test_helper ทั่วไปเมธอดแบบกำหนดเองมักถูกกำหนดให้เป็นวิธีการอินสแตนซ์ของ ActiveSupport :: TestCase ดังนั้นหากคุณต้องการเรียกหนึ่งในนั้นคุณต้องมีตัวอย่างของคลาสนั้น ด้วยการลองผิดลองถูก ActiveSupport :: TestCase.new มีพารามิเตอร์ที่ต้องการเพียงตัวเดียวดังนั้น ...

    หาก test_helper ของคุณมีเมธอดที่เรียกว่า create_user คุณสามารถเรียกใช้วิธีนี้: ActiveSupport::TestCase.new("no idea what this is for").create_user


แทนที่จะลองหรือข้อผิดพลาด - ใช้คู่มือ API ทางรถไฟเพื่อค้นหาสิ่งที่ต้องการapi.rubyonrails.org/classes/ActiveSupport/TestCase.html ... อาจเป็นคำสั่งทดสอบซึ่งเป็น:randomค่าเริ่มต้น
Mirv - Matt

มีเพียงสองวิธีคลาสที่อธิบายไว้สำหรับ ActiveSupport :: TestCase ดังนั้นฉันจึงไม่ชัดเจนว่าคลาส / โมดูลที่สืบทอดinitializeวิธีการมาจากคลาสใด แต่ดูเหมือนว่าพารามิเตอร์ที่คาดหวังจะถูกเก็บไว้@NAMEในวัตถุที่สร้างขึ้น
Nick Davies

1

ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง GEM แล้วและคุณได้เพิ่มบรรทัดต่อไปนี้ในไฟล์ environment.rb หรือ test.rb ของคุณ

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


0

คำสั่งเพื่อรันสภาพแวดล้อมการทดสอบคอนโซลของรางคือ

rails c -e test

หรือ

RAILS_ENV=test rails c

หากคุณกำลังประสบปัญหาบางอย่างเช่น

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

ก่อนอื่นคุณควรเตรียมฐานข้อมูลทดสอบของคุณโดยเรียกใช้

bundle exec rake db:test:prepare
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.