- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的集成测试间歇性失败,并且总是出现 ActiveRecord::RecordNotFound
错误。该错误发生在 Controller 内部,在给定固定装置 ID 的情况下,发生 find
调用。不过,它发生在多个 Controller 中。我在浏览网站时从未见过这种行为,但我想说测试失败的概率约为 30-50%。失败后再次运行测试似乎可以解决问题。
如果我将灯具手动加载到开发数据库中,似乎找不到的 ID 确实存在于表中。
我找不到太多关于遇到同样问题的人的信息...有什么想法吗?
更新:以下是 test_helper.rb 的内容
ENV["RAILS_ENV"] = "test"
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require 'capybara/rails'
class ActiveSupport::TestCase
# Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
#
# Note: You'll currently still have to declare fixtures explicitly in integration tests
# -- they do not yet inherit this setting
fixtures :all
# Add more helper methods to be used by all tests here...
end
# Transactional fixtures do not work with Selenium tests, because Capybara
# uses a separate server thread, which the transactions would be hidden
# from. We hence use DatabaseCleaner to truncate our test database.
DatabaseCleaner.strategy = :truncation
class ActionDispatch::IntegrationTest
# Make the Capybara DSL available in all integration tests
include Capybara::DSL
# Make the Capybara Email DSL available in all integration tests
include Capybara::Email::DSL
# Stop ActiveRecord from wrapping tests in transactions
self.use_transactional_fixtures = false
# Switch to selenium as the default driver for JS support
Capybara.default_driver = :selenium
# Only click on visible links!
Capybara.ignore_hidden_elements = true
teardown do
DatabaseCleaner.clean # Truncate the database
Capybara.reset_sessions! # Forget the (simulated) browser state
Capybara.use_default_driver # Revert Capybara.current_driver to Capybara.default_driver
end
end
更新以下是连续运行相同测试 5 次的结果。我运行了测试,等到它们完成,然后立即使用命令 rails test:integration
再次运行它们。注意:在整个测试中保持一致的 E 和 F 实际上是测试错误——我正在努力修复这些错误。例如,第二次测试运行是“正确的”,但第一次测试显示了虚假错误。
..E......E..........F.
.........E..........F.
..E......E..........F.
..E......E..........F.
..E....E.E..........F.
错误确实发生在两个单独的表中——它们并不是试图查找相同的记录。但它似乎只是存在此问题的测试的子集......
更新以下是测试结果中的实际错误:
1) Error:
test_browsing_user_snops(BrowseStoriesTest):
ActiveRecord::RecordNotFound: Couldn't find User with id=980190962
/home/myuser/.rvm/gems/ruby-1.9.3-p286/gems/activerecord-3.2.9/lib/active_record/relation/finder_methods.rb:341:in `find_one'
/home/myuser/.rvm/gems/ruby-1.9.3-p286/gems/activerecord-3.2.9/lib/active_record/relation/finder_methods.rb:312:in `find_with_ids'
/home/myuser/.rvm/gems/ruby-1.9.3-p286/gems/activerecord-3.2.9/lib/active_record/relation/finder_methods.rb:107:in `find'
/home/myuser/.rvm/gems/ruby-1.9.3-p286/gems/activerecord-3.2.9/lib/active_record/querying.rb:5:in `find'
/home/myuser/Projects/myproject/app/controllers/users_controller.rb:18:in `show'
...
请注意,当 Controller 尝试查找记录时会出现错误。相关行实际上是@user = User.find(params[:id])
。其他模型也会发生这种情况,不仅仅是用户 Controller ,也不仅仅是用户模型。
最佳答案
我担心数据截断期间可能会出现延迟,并且 Capybara 驱动 Web 浏览器的速度有时可能会导致标识列值以意外值开始(即记录 #1 为 7) - 当您期望 1 时,因为身份生成器尚未重置)。我没有证据表明情况确实如此,但这是我的最佳猜测。
获取look at item #3 at this URL 。这是一个非常简单的黑客攻击,将 use_transactional_fixtures
设置为 true 并通过将该代码粘贴到 test_helper.rb
中来对 ActiveRecord 进行 Monkeypatch。这有助于消除任何可能成为潜在问题的间歇性磁盘 IO 问题。
您可以尝试的另一件事是通过在 database.yml
文件中将数据库的文件名设置为 :memory:
来限制您的 SQLite 测试数据库。这应该完成与上面相同的事情 - 消除可能导致这些间歇性问题的虚假磁盘 IO。
关于ruby-on-rails - Ruby on Rails 集成测试期间间歇性 ActiveRecord::RecordNotFound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13617152/
我用 rspec 和下一个简单代码测试我的应用程序: require 'spec_helper' describe CarsController do describe "GET 'n
我正在尝试本地化我的 rails 应用程序 (webservice)。 我安装了 gem 'rails-i18n',它工作正常。 除了它不翻译 ActiveRecord::RecordNotFound
问题是当 Restaurant 没有任何符合条件的 MenuItems 时,ActiveRecord 说它找不到 Restaurant .这是相关代码: class Restaurant Time.
在我的app.rb中,我得到了一个'/posts/:id',我已经实现了急救 ActiveRecord:RecordNotFound ,但是它仍然会显示错误,而不是重定向到根URL。是否可以自定义Ac
post = Post.find 666 ActiveRecord::RecordNotFound: Couldn't find Post with 'id'=666 发布 => 无 post = "
当模型无法检索记录时,我的应用程序正在将 ActiveRecord::RecordNotFound 传播到 Controller 。 这是数据库查询: def self.select_intro_ve
我遇到了 this library 的问题因为即使给定的输入不在数据库中,此函数也会返回 false,而实际上它应该返回 true。 type User struct { ID
我是第一次尝试使用 exception_notification。我观看了 Railscast 并遵循了作者在 http://smartinez87.github.io/exception_notif
我正在使用 Rails nested attributes使用 allow_destroy: true。如果我这样调用: deck.update(deck_items_attributes: { id
如何在 Activeadmin 中为我的所有资源拯救 ActiveRecord::RecordNotFound? 我知道在 Rails 中我可以将 rescue_from(ActiveRecord::
我的应用程序 Controller 中有以下代码: class ApplicationController :record_not_found private def record_not_
我有一个带有用户和事件的应用程序。每个用户都有几个事件。当用户想要查看特定事件时,他将执行以下操作: def show begin @userEvents = current_user.e
我有一张表,其中包含模型中的“属于”。 该表包括用于链接两个表的 xx_id 字段。 但是,有时 xx_id 将是空白的。 当它是时,我得到 ActiveRecord::RecordNotFound。
我不太确定在处理数据库中找不到的记录时首选的方法是什么。编写返回 null 的 Find 方法还是编写返回 RecordNotFoundException 的 Get 方法更好? [Authentic
我想在我的 Rails 应用程序中实现 ajax,但收到此错误。 我进行ajax调用的erb代码如下 'showcom
我希望在用户注册时发送电子邮件。此电子邮件应包含一个链接将帐户更改为完整用户。我希望此电子邮件链接成为安全 token 。 email_token 是每个用户随机生成的 token email_act
我正处于开发 (JSON) API 阶段并决定从 ActionController::Metal 继承我的 ApiController 以利用速度等优势。 所以我包含了一堆模块来让它工作。 最近我决定
请参阅问题底部的更新... 作为引用,这个问题是根据我之前在这里遇到的一个问题所做的一些修复演变而来的:Associating Two Models in Rails (user and profil
使用我的 Rails 应用程序,我可以成功创建一个对象(称为工作;将它们视为博客文章)作为 current_user。一个用户 has_many 作品。我可以通过使用我的 postgresql 浏览器
当使用不存在的 id 访问对象的显示页面时,会抛出 RecordNotFonud 异常。有没有办法可以重定向到某个错误页面,或者在抛出此错误时可能采取不同的操作? 最佳答案 如果您使用 Rails 3
我是一名优秀的程序员,十分优秀!