Ruby on Rails 5.1 和 Vue.js 2.4.x – 使用 Karma、Jasmine 进行测试 – 如何安装?

Posted

技术标签:

【中文标题】Ruby on Rails 5.1 和 Vue.js 2.4.x – 使用 Karma、Jasmine 进行测试 – 如何安装?【英文标题】:Ruby on Rails 5.1 & Vue.js 2.4.x – Testing with Karma, Jasmine – How to install? 【发布时间】:2018-02-21 23:35:28 【问题描述】:

我有 Rails 5.1.x 和 Vue.js 2.4.x;我不会在前端混合使用 Rails 和 Vue.js——只使用 Vue.js

我添加了以下包:

package.json

...
"devDependencies": 
    "jasmine": "^2.8.0",
    "karma": "^1.7.1",
    "karma-chrome-launcher": "^2.2.0",
    "karma-jasmine": "^1.1.0",
    "webpack-dev-server": "^2.6.1"
  ,
...

Q1:我在哪里进行配置?在 webpack/test.js 或一些 karma.conf.js 文件中

Q2:这个conf文件里有什么?

Q3:我需要安装 karma-webpack 吗?


编辑 1

我能够安装 karma、jasmine 和 es6 支持,但是 它仍未正确集成到 RoR 生态系统中

/package.json

...
"devDependencies": 
    "jasmine": "^2.8.0",
    "karma": "^1.7.1",
    "karma-cli": "^1.0.1",
    "karma-jasmine": "^1.1.0",
    "karma-phantomjs-launcher": "^1.0.4",
    "karma-webpack": "^2.0.4",
    "standard": "^10.0.3",
    "webpack-dev-server": "^2.6.1"
  ,
...

/karma.conf.js

module.exports = function(config) 
  config.set(
    basePath: 'app/javascript/',

    browsers: ['PhantomJS'],

    files: [
       pattern: 'test/*.spec.js', watched: false ,
       pattern: 'test/**/*.spec.js', watched: false 
    ],

    frameworks: ['jasmine'],

    preprocessors: 
      'test/*.spec.js': ['webpack'],
      'test/**/*.spec.js': ['webpack'],
    ,

    webpack: 
      module: 
        loaders: [
           test: /\.js/, exclude: /node_modules/, loader: 'babel-loader' 
        ]
      ,
      watch: true
    ,

    webpackServer: 
      noInfo: true
    
  )

/app/javascript/test/my_test.spec.js

describe("A suite", () => 
  it("contains spec with an expectation", () => 
    expect(true).toBe(true)
  )
)

$ 业力开始

25 09 2017 15:45:02.199:WARN [watcher]: All files matched by "/home/ubuntu/workspace/app/javascript/test/**/*.spec.js" were excluded or matched by prior matchers.
25 09 2017 15:45:02.217:WARN [watcher]: All files matched by "/home/ubuntu/workspace/app/javascript/test/**/*.spec.js" were excluded or matched by prior matchers.
25 09 2017 15:45:03.147:WARN [karma]: No captured browser, open http://0.0.0.0:8080/
25 09 2017 15:45:03.156:WARN [karma]: Port 8080 in use
25 09 2017 15:45:03.156:WARN [karma]: Port 8081 in use
25 09 2017 15:45:03.157:INFO [karma]: Karma v1.7.1 server started at http://0.0.0.0:8082/
25 09 2017 15:45:03.157:INFO [launcher]: Launching browser PhantomJS with unlimited concurrency
25 09 2017 15:45:03.173:INFO [launcher]: Starting browser PhantomJS
25 09 2017 15:45:03.310:ERROR [phantomjs.launcher]: Fontconfig warning: ignoring C.UTF-8: not a valid language tag

25 09 2017 15:45:03.837:INFO [PhantomJS 2.1.1 (Linux 0.0.0)]: Connected on socket 1lM4B1iRIygqSYz3AAAA with id 19034471
PhantomJS 2.1.1 (Linux 0.0.0): Executed 1 of 1 SUCCESS (0.043 secs / 0.001 secs)

Q1:我在哪里进行配置?在 webpack/test.js 或一些 karma.conf.js 文件中

A1:karma.conf.js 工作正常,但我认为我的方法不是最好的

Q2:这个conf文件里有什么?

A2:还不确定

Q3:我需要安装 karma-webpack 吗?

A3:是的,我想是的


Q4:我必须更改哪些内容才能执行以下操作(在 RoR 5.1.x 中)?

发件人:https://vuejs.org/v2/guide/unit-testing.html

/app/javascript/test/components/my_component.spec.js

// Import Vue and the component being tested
import Vue from 'vue'
import MyComponent from 'path/to/MyComponent.vue'

// Here are some Jasmine 2.0 tests, though you can
// use any test runner / assertion library combo you prefer
describe('MyComponent', () => 
  // Inspect the raw component options
  it('has a created hook', () => 
    expect(typeof MyComponent.created).toBe('function')
  )

  // Evaluate the results of functions in
  // the raw component options
  it('sets the correct default data', () => 
    expect(typeof MyComponent.data).toBe('function')
    const defaultData = MyComponent.data()
    expect(defaultData.message).toBe('hello!')
  )

  // Inspect the component instance on mount
  it('correctly sets the message when created', () => 
    const vm = new Vue(MyComponent).$mount()
    expect(vm.message).toBe('bye!')
  )

  // Mount an instance and inspect the render output
  it('renders the correct message', () => 
    const Ctor = Vue.extend(MyComponent)
    const vm = new Ctor().$mount()
    expect(vm.$el.textContent).toBe('bye!')
  )
)

【问题讨论】:

如果您不混合使用 rails 和 vue.js,这意味着您应该有 2 个独立的应用程序 - Rails 提供 API 和 Vue.js 应用程序使用该 API 并交付内容。而且由于您所有的问题都与 vue 相关,因此我建议您删除 rails 标签,以免混淆。至于答案 - 不幸的是我无法帮助 Karma。我通过 webpack 在一个应用程序中使用 Vue.js 和 Rails,因此我还通过功能测试 (capybara) 测试了一切 更多的是设置问题;这是关于“rails/webpacker”和“Ruby on Rails 5.x”中业力测试的设置——>相关的RoR文件:“/config/webpack/test.js” .. 看看 gitlab 的源代码——它使用 rails 作为后端,vue 作为前端。 github.com/gitlabhq/gitlabhq。可能会帮助您朝着正确的方向前进。 【参考方案1】:

我之前在 Karma 中使用了自定义 Webpack 配置,但这只是我拥有的冗余 Webpack 和预处理器逻辑。所以我想出了这种对我来说似乎正确的方法。

我会推荐这个:https://github.com/rails/webpacker/blob/master/docs/testing.md#karma-setup-for-typescript

附:我故意不复制粘贴代码 sn-ps,因为现有文档将来可能会更改。

【讨论】:

谢谢!我会在接下来的一周内对其进行测试,如果成功,我会给你赏金

以上是关于Ruby on Rails 5.1 和 Vue.js 2.4.x – 使用 Karma、Jasmine 进行测试 – 如何安装?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails全栈课程5.5 项目上线--nginx+unicorn部署项目域名映射

思考Ruby On Rails的底层代码(Ruby on Rails 開發秘籍 | Ruby on Rails 快速入門)

Ruby on Rails入门篇

如何在 ruby​​ on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby​​?

Mac上配置 Ruby on Rails和Git

第一个Landing Page的制作方法(Ruby on Rails 開發秘籍 | Ruby on Rails 快速入門)