小编Var*_*rac的帖子

Rails,成为朋友并在测试套件之间重置数据库

工作正在从Rails 3过渡到Rails 4.在开发方面,一切似乎都或多或少地顺利运行,但是当所有套件 - 单元,功能和集成 - 一次性运行时,测试会导致各种各样的失败.rake:test.

有趣的是,单独运行每个套件都不会产生任何故障.这有力地表明数据库没有像Rails 3那样重置我们在Rails 4中的测试.

我已经尝试覆盖rake:db:test:prepare在运行每个套件之前执行测试任务,但这显然没有做我认为它做的,或者更确切地说,我想要它做什么,这是使用一套新的每个测试的数据,因此独立于其他测试成功或失败 - 在我们的Rails 3设置中它(已经或应该是)的方式.

为什么会这样?我该怎么办呢?

(请注意,测试框架是带有夹具等的vanilla Rails.我们得到的测试失败通常是外键错误或数据以预期方式更改的失败,在测试之前重置DB时不会显示套房.)

编辑:

以下是我对Rakefile所做的更改.我们的想法是获得rake:test,就像在Rails 3中一样,除了在单元,功能和集成套件之间正确地重置数据库.

# /Rakefile

task :test => [];
Rake::Task[:test].clear
task :test do
    puts Rails.env
    if Rails.env == "test"
        puts "units"
        # Rake::Task["db:drop"].execute - results in 'test database not configured' error
        # Rake::Task["db:reset"].execute - results in 'relation 'table' does not exist' error
        Rake::Task["db:create"].execute
        Rake::Task["db:migrate"].execute
        Rake::Task["test:units"].execute
        puts "functionals"
        Rake::Task["db:schema:load"].execute
        Rake::Task["test:functionals"].execute
        puts "integration"
        Rake::Task["db:schema:load"].execute
        Rake::Task["test:integration"].execute
    end
end
Run Code Online (Sandbox Code Playgroud)

编辑2:

Rails版本4.1.8

这是我的test_helper.我省略了不能使用我们数据的辅助方法,因为我可能不允许共享它们,并且它们与测试数据库的加载方式无关.

另请注意,我们还有一个自定义schema.rb,从中生成测试数据,因为尝试从迁移创建它们不支持我们在最终产品中需要的一些自定义功能/行为,例如物化视图.编辑后的内容将包含在<< …

ruby-on-rails ruby-on-rails-3

11
推荐指数
1
解决办法
1581
查看次数

Rails页面特定的JavaScript:什么是最佳实践?

任何了解Rails资产管道的人都知道,清单中包含的所有JavaScript文件的默认行为都会被归入一个大的,笨拙的,不幸的球.

ALL THE JAVASCRIPT -> application.js
Run Code Online (Sandbox Code Playgroud)

这意味着如果你有一个JavaScript文件foo.js,它不仅会激活控制器foo到达的页面,还会激活每个其他页面.

这很容易解决,但我想知道最好的方法是什么.

我最初让application.html.erb使用JavaScript标记将当前控制器和操作传递给我的应用程序中的JavaScript.

<%= javascript_tag do %>
  window.givenController = "<%= controller_name %>";
  window.givenAction = "<%= action_name %>";
<% end %>
Run Code Online (Sandbox Code Playgroud)

在我的js文件中,我将使用这种if语句在控制器命名文件上包含特定于页面的代码,以确保它们仅在这些页面上运行.

if(givenController == "foo" && givenAction == "bar"){
  doStuff();
}
Run Code Online (Sandbox Code Playgroud)

我的老板认为这会创建不必要的变量,而是建议我使用if语句指向页面上的特定JQ元素:

if($("#some-element-in-foo").length > 0){
  doStuff();
}
Run Code Online (Sandbox Code Playgroud)

虽然我显然希望遵循我老板的指示,但我对如何在未来的应用程序中解决这个问题感到矛盾.我认为我的方法比建议的更具表现力和灵活性,但我可能会遗漏一些关键缺陷.

您如何看待这两种做法,无论是自己还是彼此,以及为什么?有什么可能是解决同样问题的更好方法?

javascript jquery ruby-on-rails

6
推荐指数
1
解决办法
1211
查看次数

.Try vs && performance

假设我有一个来自SQL查询的传入值,如下所示:

grok = Foo.select(:foo_attr1, :foo_attr2).first
Run Code Online (Sandbox Code Playgroud)

foo_attr2是一个可以为空的领域.现在假设我需要对输出进行处理(如果存在的话).

krug = grok.foo_attr2.try(:bar).try(:baz)
gnar = grok.foo_attr2 && grok.foo_attr2.bar.baz # Assumes bar will always return output that can be baz'd
Run Code Online (Sandbox Code Playgroud)

这两个操作中哪一个更好用,为什么?

ruby-on-rails

4
推荐指数
1
解决办法
1029
查看次数