问题标签 [rspec-rails]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
5127 浏览

ruby-on-rails - ActiveRecord 对象相等

根据ActiveRecord::Base的文档:

==(comparison_object) 如果 compare_object 是同一个确切的对象,或者 compare_object 是相同的类型并且 self 有一个 ID 并且它等于 comparison_object.id,则返回 true。

请注意,根据定义,新记录不同于任何其他记录,除非其他记录是接收者本身。此外,如果您使用 select 获取现有记录并忽略 ID,则您只能靠自己,此谓词将返回 false。

另请注意,销毁记录会在模型实例中保留其 ID,因此删除的模型仍然具有可比性。

但我的观察表明,它只比较实例,而不是 id,因此以下是正确的:

问题是 2 个 AR 实例被认为是不同的,而文档明确表示它们应该相等?

更新:平等确实按预期工作上面的代码示例无关紧要。请看下面我的回答。

0 投票
2 回答
2983 浏览

ruby-on-rails - 使用 RSpec 测试控制器时如何调用 Rails 命名路由?

我想在我的文章控制器中测试永久链接操作,它使用命名路由(/permalink/terms-of-use):

这是规格:

但我得到这个错误:

'ArticlesController 永久链接呈现页面'中的 ActionController::RoutingError 没有路由匹配 {:controller=>"articles", :action=>"/permalink/@article.permalink"}

更新:

知道如何编写 GET 吗?

0 投票
1 回答
3986 浏览

ruby-on-rails-3 - 在 Ruby on Rails 3 / Postgres / Apache Passenger 应用程序中跟踪内存泄漏

你好,

我们最近将应用程序更新到 Rails 3.0.4(在线开发服务器上的 3.0.5)。从 2.3.10 到 3.0.4 的大部分更改是由于过时或过时的插件和 gem 造成的,并且可以相对容易地解决。但有一件事让我很生气:

在开发模式下,每个 Web 请求都会导致服务器进程分配比以前多 50-60 MB的内存。这个内存在请求之后没有被释放,至少不是全部。在 10-20 个请求之后,每个 Ruby 实例消耗超过500 MB 的 RAM,而我们之前的 Rails 2.3.10 实例很少超过 200 MB。

这使得我们无法运行我们的 1300 次测试,因为在测试结束之前开发机的 4GB RAM 已被填满。它只发生在开发模式下cache_classes = false。如果我将 cache_classes 切换为 true,Rails 实例将消耗大约 200MB 的内存,然后停留在那里。但是,在测试期间,即使 cache_classes = true,内存使用量也会增加。

我查询了 ObjectSpace,发现每个请求都会创建大约 3500 个新 Proc、多达 50'000 个新字符串以及 3000 个新哈希和数组,但未释放。这些字符串(转储时)包含我的整个源代码,包括插件和 gem、文档、源代码注释和路径名。(为什么?)

为了找到造成这种情况的原因,我尝试了以下方法:(每次更改后,我都使用ab -n 50.)

  1. 我创建了一个新的 Rails 3 应用程序,它只有一个资源和控制器以及 SQLite3 DB。内存使用量从 60 MB 开始,一直低于 80 MB
  2. 我将“sqlite3”更改为“pg”,并将新的 Rails 3 应用程序指向我现有的 Postgres DB。内存使用量从 110 MB 开始,并没有超过 130 MB。(附带问题:为什么 Postgres gem 使用比 SQLite3 gem 更多的内存?)
  3. 我将我的Gemfile 和 Gemfile.lock从损坏的 Rails3 应用程序复制到基本应用程序并运行bundle install没有变化,无论发出多少请求,内存都保持在 115MB 左右。
  4. 我在损坏的 Rails3 应用程序中创建了一个空的“def FooController; def foo; render :text => 'foo' end; end”。内存使用量增长较慢,但在 requests 之后仍然没有停止增长
  5. 我删除了除 FooController 路由之外的所有路由。没有变化
  6. 我禁用了所有宝石,但以下除外:pg, rails, aasm, will_paginate, geokit-rails3, koala, omniauth, paperclip. 没有变化
  7. 我禁用了 ApplicationController 中的每个 before_filter 和 after_filter 以及 environment.rb 中的每个非必需项include。我还将 boot.rb、environment.rb 和 application.rb 与我的基本 Rails 3 应用程序同步,除了五个相对简单的观察者,在 /lib 和 filter_parameters 中自动加载文件。没有变化。每个新请求仍会额外消耗 10-50 MB 的 RAM。

如果您知道这里出了什么问题,以及内存泄漏可能在哪里,我将非常感谢任何帮助。我在 OS X Snow Leopard 上运行 Rails 3.0.4,在 Debian Lenny 上运行 Rails 3.0.5,以及

谢谢!

接近了:

我已经删除了每个插件、每个 gem、每个扩展以及我没有亲自编写的所有内容,因此我的应用程序基本上是赤裸裸的。特别是,我删除了这些插件:acts_as_list, acts_as_tree, asset_packager, forgot_password, fudge_form, fudge_scaffold, paperclippolymorph, query_trace, rails_upgrade, repeated_auto_complete-0.1.0, role_requirement, to_select, validates_url, and ym4r_gm.

现在我的应用程序 - 只有上面的 FooController 仍然有效!- 以 65MB 启动并且永远不会超过 75MB 的 RAM,即使在使用ab -n 1000 -c1(使用 ApacheBench 向 /foo 发出 1000 个 HTTP 请求)敲击它之后也是如此。不幸的是,如果没有插件,这也是唯一有效的 URI。

经过一番挖掘,似乎是 Restful Authentication 和 Acts As State Machine (AASM) 插件之间的组合导致了内存泄漏。另请参阅https://github.com/Satish/restful-authentication/issues#issue/11。我还不确定为什么,只是在我的准系统项目中执行“包含 AASM”并不会单独导致 RAM 使用量增长。

我会进一步调查。

发现罪魁祸首

它是 AASM。在 Rails 3 中,它似乎泄漏了 AASM::xxx 对象实例。看

找到第二个罪魁祸首

rspec 中还有另一个内存泄漏。这使得我的测试几乎无法忍受,即使在删除 AASM 之后也是如此,因为两个并行运行的 rspec 任务(使用https://github.com/grosser/parallel_tests)最后占用了将近 3GB 的内存。请参阅https://github.com/rspec/rspec-core/issues/#issue/321

0 投票
1 回答
1774 浏览

ruby-on-rails - RSpec 1.3.3 Rails 2.3.9 Webrat 0.7.3“未定义的方法`assign`”

我的规格

投掷

宝石:

和 spec_helper.rb

0 投票
3 回答
7358 浏览

ruby-on-rails-3 - Rails 3 + Rspec 2:验证失败:电子邮件已被占用

我有 2 个模型,User并且Bucket. User has_many BucketsBucket belongs_to一个User

factories.rb中,我有:

我有一个 login_user 模块,如下所示:

我正在使用 Spork 和 Watch,我Buckets_controller_spec.rb的操作很简单:

错误总是一样的:

只有当我拥有Factory(:bucket). 当我不添加Factory(:bucket).

它总是同样的错误。我尝试添加:email => Factory.next(:email)到用户,但没有成功。

编辑:

rails c test

编辑2:

我发现错误在关联中,但是,我不知道如何解决它。

0 投票
1 回答
3532 浏览

ruby-on-rails - Rspec 和 Rspec-Rails Gem 之间有什么区别?

我的 GEMFILE 中有以下内容:

“rspec”和“rspec-rails”有什么区别?

0 投票
1 回答
3751 浏览

ruby-on-rails - 使用 RSpec 进行测试:根据第一个子域设置语言环境

我是 RSpec 的新手,我不知道如何测试以下内容:

在我的应用程序控制器(在 Rails 3 应用程序中)中,我在前置过滤器中设置区域设置,如下所示

所以基本上,“en.example.com”和“example.com”将有一个“en”语言环境,而“fr.example.com”会将语言环境设置为“fr”。

我该如何测试呢?

0 投票
1 回答
3147 浏览

ruby-on-rails - 工厂女孩和嵌套属性在 Rails 3

我有 2 个模型,一个接受另一个模型的属性,我试图找到一种聪明的方法来使用 Factory girl 来设置两者的数据。

我的工厂

预订规格

我环顾了 rdocs,但似乎找不到我要找的东西。

0 投票
1 回答
1378 浏览

ruby-on-rails - 具有inherited_resources 的Rspec 正在重定向而不是在更新失败时呈现

我对 rspec 和inherited_resources 都是新手。我有一个简单的资源,联系人,它有一个名称字段。控制器没有特殊功能。

我已经使用 mock_model 编写了创建和索引的规范。但是,在更新时使用mock_model时,放置时找不到联系人。所以,我转而使用真实模型:

我收到以下错误:

当我检查 status_code 时,它​​是一个 302 重定向到 /contacts/:id。

我究竟做错了什么?

0 投票
2 回答
2819 浏览

ruby-on-rails - 如何规范依赖 Memcached 的操作?

我们有一个使用 RSpec 测试的 Rails 应用程序。我们想要指定依赖于 Memcached 的操作。这样做的最佳做法是什么?

我想通过存根所有调用来做到这一点Rails.cache。这是一个好主意吗?

根据@Pan Thomakos 的建议,我正在添加一些关于我正在尝试测试的场景之一的额外细节:

我们的系统中有帐户的概念,因此在每次请求时我们都会检索当前用户和当前帐户。因为系统中的帐户不多,我们将它们全部保存在缓存中并从那里检索它们。

出于这个原因,在这种情况下,缓存不仅是一种很好的行为,而且是预期的行为和我想要测试的东西。因此关闭缓存是行不通的。