问题标签 [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.
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 实例被认为是不同的,而文档明确表示它们应该相等?
更新:平等确实按预期工作。上面的代码示例无关紧要。请看下面我的回答。
ruby-on-rails - 使用 RSpec 测试控制器时如何调用 Rails 命名路由?
我想在我的文章控制器中测试永久链接操作,它使用命名路由(/permalink/terms-of-use):
这是规格:
但我得到这个错误:
'ArticlesController 永久链接呈现页面'中的 ActionController::RoutingError 没有路由匹配 {:controller=>"articles", :action=>"/permalink/@article.permalink"}
更新:
知道如何编写 GET 吗?
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
.)
- 我创建了一个新的 Rails 3 应用程序,它只有一个资源和控制器以及 SQLite3 DB。内存使用量从 60 MB 开始,一直低于 80 MB。
- 我将“sqlite3”更改为“pg”,并将新的 Rails 3 应用程序指向我现有的 Postgres DB。内存使用量从 110 MB 开始,并没有超过 130 MB。(附带问题:为什么 Postgres gem 使用比 SQLite3 gem 更多的内存?)
- 我将我的Gemfile 和 Gemfile.lock从损坏的 Rails3 应用程序复制到基本应用程序并运行bundle install。没有变化,无论发出多少请求,内存都保持在 115MB 左右。
- 我在损坏的 Rails3 应用程序中创建了一个空的“def FooController; def foo; render :text => 'foo' end; end”。内存使用量增长较慢,但在 requests 之后仍然没有停止增长。
- 我删除了除 FooController 路由之外的所有路由。没有变化。
- 我禁用了所有宝石,但以下除外:
pg, rails, aasm, will_paginate, geokit-rails3, koala, omniauth, paperclip
. 没有变化。 - 我禁用了 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 对象实例。看
- https://github.com/jeffp/enumerated_attribute/issues/#issue/20
- https://github.com/rubyist/aasm/issues/31
- https://github.com/Satish/restful-authentication/issues/#issue/11
找到第二个罪魁祸首
rspec 中还有另一个内存泄漏。这使得我的测试几乎无法忍受,即使在删除 AASM 之后也是如此,因为两个并行运行的 rspec 任务(使用https://github.com/grosser/parallel_tests)最后占用了将近 3GB 的内存。请参阅https://github.com/rspec/rspec-core/issues/#issue/321。
ruby-on-rails - RSpec 1.3.3 Rails 2.3.9 Webrat 0.7.3“未定义的方法`assign`”
我的规格
投掷
宝石:
和 spec_helper.rb
ruby-on-rails-3 - Rails 3 + Rspec 2:验证失败:电子邮件已被占用
我有 2 个模型,User
并且Bucket
. User
has_many
Buckets
和Bucket
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:
我发现错误在关联中,但是,我不知道如何解决它。
ruby-on-rails - Rspec 和 Rspec-Rails Gem 之间有什么区别?
我的 GEMFILE 中有以下内容:
“rspec”和“rspec-rails”有什么区别?
ruby-on-rails - 使用 RSpec 进行测试:根据第一个子域设置语言环境
我是 RSpec 的新手,我不知道如何测试以下内容:
在我的应用程序控制器(在 Rails 3 应用程序中)中,我在前置过滤器中设置区域设置,如下所示
所以基本上,“en.example.com”和“example.com”将有一个“en”语言环境,而“fr.example.com”会将语言环境设置为“fr”。
我该如何测试呢?
ruby-on-rails - 工厂女孩和嵌套属性在 Rails 3
我有 2 个模型,一个接受另一个模型的属性,我试图找到一种聪明的方法来使用 Factory girl 来设置两者的数据。
我的工厂
预订规格
我环顾了 rdocs,但似乎找不到我要找的东西。
ruby-on-rails - 具有inherited_resources 的Rspec 正在重定向而不是在更新失败时呈现
我对 rspec 和inherited_resources 都是新手。我有一个简单的资源,联系人,它有一个名称字段。控制器没有特殊功能。
我已经使用 mock_model 编写了创建和索引的规范。但是,在更新时使用mock_model时,放置时找不到联系人。所以,我转而使用真实模型:
我收到以下错误:
当我检查 status_code 时,它是一个 302 重定向到 /contacts/:id。
我究竟做错了什么?
ruby-on-rails - 如何规范依赖 Memcached 的操作?
我们有一个使用 RSpec 测试的 Rails 应用程序。我们想要指定依赖于 Memcached 的操作。这样做的最佳做法是什么?
我想通过存根所有调用来做到这一点Rails.cache
。这是一个好主意吗?
根据@Pan Thomakos 的建议,我正在添加一些关于我正在尝试测试的场景之一的额外细节:
我们的系统中有帐户的概念,因此在每次请求时我们都会检索当前用户和当前帐户。因为系统中的帐户不多,我们将它们全部保存在缓存中并从那里检索它们。
出于这个原因,在这种情况下,缓存不仅是一种很好的行为,而且是预期的行为和我想要测试的东西。因此关闭缓存是行不通的。