Ruby on rails 运行规范时发生非描述性错误,具体取决于种子

Ruby on rails 运行规范时发生非描述性错误,具体取决于种子,ruby-on-rails,ruby,rspec,capybara,Ruby On Rails,Ruby,Rspec,Capybara,我已经编写了一个特性规范来测试我的应用程序中正确的多租户行为。它以两个不同的用户身份登录,通过填写表单并以每个用户的身份提交,创建一个新的演示文稿,并确认每次只有租户自己的演示文稿对他们可见 该规范有时通过良好,有时不通过。真正令人困惑的是发生的错误: Failure/Error: click_button "Präsentation erstellen" TypeError: can't cast ActiveSupport::HashWithIndifferentAccess to #

我已经编写了一个特性规范来测试我的应用程序中正确的多租户行为。它以两个不同的用户身份登录,通过填写表单并以每个用户的身份提交,创建一个新的
演示文稿
,并确认每次只有租户自己的演示文稿对他们可见

该规范有时通过良好,有时不通过。真正令人困惑的是发生的错误:

Failure/Error: click_button "Präsentation erstellen"
TypeError:
  can't cast ActiveSupport::HashWithIndifferentAccess to
# ./app/controllers/presentations_controller.rb:21:in `create'
# ./spec/features/presentation_management_spec.rb:22:in `block (3 levels) in <top (required)>'
/spec/features/presentation\u management\u spec.rb

18 def create
19  @presentation = Presentation.new(presentation_params)
20  
21  if @presentation.save
22    flash_for(@presentation, :create)
23    redirect_to @presentation
24  else
25    render :new
26  end
27 end
16 sign_in @user1
17
18 visit new_presentation_path
19 fill_in "Titel", with: title1
20 fill_in "Standard-Foliendauer", with: "60"
21
22 click_button "Präsentation erstellen"
23
24 page.should have_content "erfolgreich erstellt"
25 page.should have_content title1
我不明白这个错误在这里有什么意义,我只是点击一个按钮,创建一个新的演示并保存它。保存本身会抛出错误。怎么用?为什么?

更糟糕的是,这种只发生在一些rspec种子上。例如,
48719
运行良好:

..........................................................................................

Finished in 48.17 seconds
90 examples, 0 failures

Randomized with seed 48719
这意味着此错误仅在某些规格的执行顺序下发生。但是这个错误根本不是描述性的,我也不知道该怎么办。我尝试过重置所有数据库,重新启动我的整个服务器,打印出按下按钮的页面,注释不同的行,什么都不会改变,甚至不会提示可能的错误

以下是我的演示模型:

 class Presentation < ActiveRecord::Base
  store_accessor :properties, :bg_color, :bg_image

  validates :title, presence: true
  validates :default_duration, presence: true, numericality: { greater_than_or_equal_to: 1 }

  def to_s
    title
  end

end
这里唯一的散列是
{“bg_color”=>“#ffffff”}
,分配给
属性。
properties
字段是
hstore
类型。也许这是hstore的一个问题,这可能解释了为什么Rails错误输出无法将任何东西放在
无法强制转换的后面。。。因为它不是Rails本机真正理解的数据类型

编辑2

我刚刚在rails控制台上创建一个新的
演示文稿时,在开发过程中遇到了完全相同的错误。我最初的想法是,我可能在
搜索路径
中遗漏了
hstore
模式,但添加它没有什么好处

这证实了这不是如何编写测试的问题,而是实际的编码问题。现在我不知道该怎么办。

试试这个:

注释掉spec_helper.rb中的以下行(如果存在)

config.order = "random"

并使用来修复此问题,因为此问题似乎与运行测试套件的数据有关。

我认为您的做法是正确的,它与将属性作为准备好的语句保存到hstore数据类型有关。也许这个答案会对你有所帮助。:)


我的Rails应用程序中也有同样的错误。最后我发现它是由以下代码引起的(使用gem序列化用户的所有属性):

class UserSerializer
我将代码更改为以下内容,然后没有错误:

class UserSerializer < ApplicationModelSerializer
  def attributes
    object.attributes
  end
end
class UserSerializer

我还没有找到背后的真正原因。希望它能有所帮助。

这确实是一个奇怪的错误,因为它通常会一直出现,而不是随机出现。我将执行以下操作:首先尝试从视图中删除与
属性相关的任何参数,以便您可以看到正是这些参数导致了错误。如果是这样,那么我将尝试将请求
params
对象转换为本机
Hash
,因为它们是
ActiveSupport::HashWithInferenceAccess
,这可能是问题所在。视图不是问题的“原因”。它是
@presentation.save
中的控制器,可以从stacktrace中读取。我的意思不是在视图中发生异常,而是从表单视图中删除与
属性相关的任何参数,以便您的控制器不会看到/处理它们。您能上传您的文件吗?(要点)我的Gemfile:但这难道不能消除症状,而不是解决问题吗?也许我在这里遇到的错误也会发生在生产中。@yerforkferchips将数据库清理器集成到您的测试套件中。这也消除了症状,不是吗?@yerforkferchips,正如我们所知,
每个测试都应该独立运行
,因此,为每个测试提供唯一的数据集很好,因此,添加数据库清理器没有问题。我只是在尝试在控制台上创建一个记录时遇到了这个错误,所以这似乎不仅仅与测试有关。否则,这是一个很好的建议。我非常肯定它与hstore有关,但我不会手动使用准备好的语句;遗憾的是,您链接的答案提到了Rails3.2中的一个问题,在这个问题中,hstore本机不受支持。我正在使用Rails 4.0.2,尝试添加代码会告诉我,
ActiveRecord::Coders::Hstore
是一个未初始化的常量。
class UserSerializer < ApplicationModelSerializer
  attributes *User.attribute_names.map(&:to_sym)
end
class UserSerializer < ApplicationModelSerializer
  def attributes
    object.attributes
  end
end