小编Gly*_*oko的帖子

如何使用Rails 6 / Zeitwerk在Rails初始化程序中预加载问题?

我正在使用一个初始化程序,该初始化程序通过将一些应用程序关注点包含到第三方库中来对应用程序进行一些猴子修补。基本上:

# config/initializers/my_initializer.rb

class SomeExternalLib
  include MyConcern1
  include MyConcern2
end
Run Code Online (Sandbox Code Playgroud)

在Rails 5.2.3中可以正常工作,但是在升级到Rails 6时收到以下弃用消息:

声明警告:初始化会自动加载常量MyConcern1和MyConcern2。

不建议这样做。在将来的Rails版本中,初始化期间的自动加载将成为错误情况。

重新加载不会重新启动应用程序,因此初始化期间执行的代码不会再次运行。因此,例如,如果重新加载ApplicationHelper,则预期的更改将不会反映在该过时的Module对象中。

这些自动加载的常量已被卸载。

请查看“自动加载和重新加载常量”指南以获取解决方案。(从/Users/myuser/code/myapp/config/environment.rb:7调用)

我的担心在应用程序/控制器/问题/中。经过一番调查,我发现该路径没有被自动加载,但是我无法弄清楚如何使Zeitwerk(Rails 6的新自动加载器)动态地加载该路径。我尝试按照此处描述的STI自动加载模式进行操作,但是没有运气。任何想法如何解决此弃用警告?

ruby ruby-on-rails autoload ruby-on-rails-6

6
推荐指数
2
解决办法
996
查看次数

如何编写Scalatest测试以将列表中的值与范围进行匹配?

如何使用Scalatest编写测试以查看列表是否在给定范围内包含双精度?

例如,如何检查以下列表中的元素大约为10?

val myList = List(1.5, 2.25, 3.5, 9.9)
Run Code Online (Sandbox Code Playgroud)

对于列表之外的值,我可能会写一个测试

someVal should be (10.0 +- 1.0)
Run Code Online (Sandbox Code Playgroud)

对于可以精确知道其值的列表,我会写

someList should contain (3.5)
Run Code Online (Sandbox Code Playgroud)

但据我所知,没有一种好的方法可以使用范围来测试列表中的项目。就像是

someList should contain (10.0 +- 1.0)
Run Code Online (Sandbox Code Playgroud)

似乎不起作用。知道如何编写一个优雅的测试来实现这一目标吗?

scala scalatest

5
推荐指数
1
解决办法
319
查看次数

为什么在structure.sql中看到`SET xmloption = content;`?

我正在使用Rails 6,最近编写了一个小迁移文件,将一列添加到表中。简单的东西:

class AddInstagramUsernameToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :instagram_username, :string
  end
end
Run Code Online (Sandbox Code Playgroud)

但是请注意,我在运行迁移时看到以下行添加到了structure.sql中:

SET xmloption = content;

我对此并不特别担心(诚然,描述该选项的文档使它看起来似乎很无害),但是我不想让这么小的迁移更改任何元postgres内容。我尝试降级到Rails 5摆脱了这条线,但是没有运气。我使用的是Postgres版本10.8,最近尚未升级。

目前,我不知道该添加什么内容,如果可能的话,我想摆脱它。任何人都知道是什么原因造成的/如何预防呢?

ruby postgresql ruby-on-rails ruby-on-rails-6

5
推荐指数
1
解决办法
517
查看次数

我可以设置一个 QUnit 钩子在套件中的所有测试之前运行吗?

我正在使用 ember-qunit 并在我的应用程序中有一项服务,可以进行一些重要的 api 调用。为了解决这个问题,我使用了一个测试助手:

// tests/helpers/mock-my-service.js
import { mock } from 'ember-data-factory-guy';

export function stubMyService(hooks) {
  hooks.beforeEach(function() {
    mock({
      type: 'GET',
      url: 'https://example.com',
      responseText: [
        { some: 'complex data' }
      ],
      status: 200
    });
  });
}

// tests/some-test.js
import { stubMyService } from 'helpers/mock-my-service';

module('Integration | Component | Whatever', function(hooks) {
  stubMyService(hooks);
  ...
}
Run Code Online (Sandbox Code Playgroud)

最近的一项功能要求在应用程序中相当高级的位置使用此服务,这意味着我现在stubMyService(hooks);几乎在每个测试中都会说。这意味着从现在开始,我必须在所有测试中都包含这个助手。有没有办法在全局范围内包含钩子?例如 RSpec 有:

config.before(:suite) do
  # runs before entire suite
end
Run Code Online (Sandbox Code Playgroud)

我希望能够做类似的事情

// tests/test-helper.js
import { stubMyService } from 'helpers/mock-my-service';

QUnit.module.beforeSuite(function(hooks) {
  stubMyService(hooks); …
Run Code Online (Sandbox Code Playgroud)

javascript testing qunit ember-qunit

5
推荐指数
1
解决办法
377
查看次数