จะกำหนดค่า Jasmine ใน Rails 6 ได้อย่างไร?


9

ฉันจะกำหนดค่าจัสมินได้อย่างไรในสภาพแวดล้อม Rails 6 (ที่ Webpack แทนที่ไพพ์ไลน์ของสินทรัพย์สำหรับ Javascript) ดังนั้นฉันสามารถทดสอบโมดูล Javascript ที่ฉันเขียนขึ้นสำหรับแอพของฉันได้อย่างไร

ฉันติดตั้งพลอยจัสมิน, วิ่งrails generate jasmine:install, และแก้ไขjasmine.ymlให้ชี้ไปที่ตำแหน่งของแหล่งจาวาสคริปต์และข้อมูลจำเพาะของฉัน

ปัญหาคือฉันไม่สามารถใช้คำสั่งนำเข้า / ส่งออก (ตัวอย่างเช่นพยายามโหลดโมดูลแรกของฉันไปที่ผลการทดสอบในข้อผิดพลาดนี้ใน Chrome: Uncaught SyntaxError: Unexpected token 'export')

จากสิ่งที่ฉันสามารถบอกได้ฉันต้องตั้งค่าจัสมินให้ใช้บาเบล แต่ฉันไม่มีโชคในการค้นหาคำแนะนำเกี่ยวกับวิธีการทำสิ่งนี้ในเค้าโครง Rails 6 ใหม่


เฮ้แซค @Dofs คุณมีโอกาสได้ดูคำตอบของฉันหรือไม่? เพียงพอสำหรับคุณหรือฉันควรช่วย / ตรวจสอบให้ลึกกว่านี้ใช่ไหม
Sergey Mell

ยัง. มกราคมและกุมภาพันธ์เป็นช่วงเวลาที่ยุ่งที่สุดของปีสำหรับงานประจำของฉัน ฉันจะแจ้งให้คุณทราบโดยเร็วที่สุด
แซค

คำตอบ:


5

ใช่คุณพูดถูก. ปัญหาหลักของjasmine-gemคือมันไม่ได้ท่อสเป็คผ่านบาเบล jasmine-gemให้ฉันโพสต์วิธีการแก้ปัญหาที่เร็วที่สุดในการแก้ไขปัญหาของคุณและหลังจากนั้นผมจะคิดว่าการดำเนินการที่เป็นไปได้ของวิธีการที่คล้ายกันใน

แนวคิดหลักคือการส่งรายละเอียดผ่าน webpack ทางรถไฟตราบใดที่มีการกำหนดค่า babel ทั้งหมดที่จำเป็น

  1. ติดตั้งjasmine-coreเนื่องจากเราจะไม่ใช้jasmine-gemในโซลูชันนี้
    yarn add jasmine-core -D
  2. ตอนนี้สร้าง webpack เพิ่มเติมสองชุด หนึ่งสำหรับจัสมินและจะมีจัสมินและนักวิ่งทดสอบเท่านั้น

    // app/javascript/packs/jasmine.js
    
    import 'jasmine-core/lib/jasmine-core/jasmine.css'
    import 'jasmine-core/lib/jasmine-core/jasmine-html.js'
    import 'jasmine-core/lib/jasmine-core/boot.js'
    import 'jasmine-core/images/jasmine_favicon.png'
    

    และอันที่สองสำหรับรหัสแอปพลิเคชันของคุณและรายละเอียด

    // app/javascript/packs/specs.js
    
    // First load your regular JavaScript (copy all the JavaScript imports from your main pack).
    let webpackContext = require.context('../javascripts', true, /\.js(\.erb)?$/)
    for(let key of webpackContext.keys()) { webpackContext(key) }
    
    // Then load the specs
    let specsContext = require.context('../spec', true, /\.js(\.erb)?$/)
    for(let key of specsContext.keys()) { specsContext(key) }
    

    เอาใจใส่กับคุณ'../javascripts'และ'../spec'เส้นทาง สำหรับฉันมันดูเหมือน'../../assets/javascripts'และให้'../../../spec'ความเคารพ

  3. จากนั้นเพิ่ม Webpack ProviderPlugin สำหรับ Jasmine (เพิ่มรหัสนี้ลงในconfig/webpack/environment.js)

    // config/webpack/environment.js
    
    const webpack = require('webpack')
    
    environment.plugins.prepend('Provide', new webpack.ProvidePlugin({
       jasmineRequire: 'jasmine-core/lib/jasmine-core/jasmine.js',
    }))
    
  4. เพิ่มหน้า ranner Jasmine ให้กับแอปพลิเคชันของคุณ

    # config/routes.rb
    
    Rails.application.routes.draw do
      # ...
    
      if Rails.env.development? || Rails.env.test?
        get 'jasmine', to: 'jasmine#index'
      end
    end
    
    # app/controllers/jasmine_controller.rb
    
    class JasmineController < ApplicationController
      layout false
    
      def index
      end
    end
    
    # app/views/jasmine/index.html.haml
    
    <html>
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <%= stylesheet_pack_tag 'jasmine', :media => 'all' %>
    </head>
    <body>
      <%= javascript_pack_tag 'jasmine' %>
      <%= javascript_pack_tag 'specs' %>
    </body>
    </html>
    
  5. ตอนนี้จัสมินของคุณควรทำงานใน/jasmineเส้นทาง

คำตอบนี้จัดทำขึ้นบนพื้นฐานของโพสต์นี้อย่างไรก็ตามฉันได้ตรวจสอบคำแนะนำเกี่ยวกับ ruby ​​2.6.3, Rails 6.0.2 อีกครั้ง, เพิ่มการเปลี่ยนแปลงคำแนะนำที่เหมาะสมและพิสูจน์ว่ามันใช้งานได้จริง

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


ฉันขอให้คุณทดสอบ somethin ได้ไหม ผมทำตามคำแนะนำเหล่านี้ดอกมะลิคือการทำงาน แต่จู่ ๆbootstrap.min.jsมีการขว้างปาข้อผิดพลาดที่โดยทั่วไปหมายถึงไม่ได้ถูกโหลดก่อนjquery bootstrapอย่างไรก็ตาม] ฉันไม่สามารถหาสิ่งที่อยู่ในรหัสนี้มีการเปลี่ยนแปลงเพื่อโหลด JS ... โดยเฉพาะอย่างยิ่งตั้งแต่บูตของฉันจะถูกโหลดผ่าน CDN ในรูปแบบแอพลิเคชันหลังจากที่javascript_pack_tag 'application'สายของฉันและมีอยู่แล้วapplication.js require('jquery')หากคุณมีการตั้งค่านี้ในสภาพแวดล้อมแบบโลคัลคุณสามารถโหลด bootstrap ผ่าน CDN ในรูปแบบแอปพลิเคชันและดูว่าใช้งานได้หรือไม่
James

ฉันคิดออก ขั้นตอนที่ 3 คือการแทนที่รหัสที่เพิ่มปลั๊กอิน jquery คำตอบนี้แก้ไขได้: stackoverflow.com/questions/51447443/…
james
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.