Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用Rspec对Rails模型进行多次初始化测试_Ruby On Rails_Ruby_Rspec_Metaprogramming - Fatal编程技术网

Ruby on rails 使用Rspec对Rails模型进行多次初始化测试

Ruby on rails 使用Rspec对Rails模型进行多次初始化测试,ruby-on-rails,ruby,rspec,metaprogramming,Ruby On Rails,Ruby,Rspec,Metaprogramming,我正在为RubyonRails引擎编写Rspec测试。我的引擎为ActiveRecord模型提供了一个类方法is\u a\u limesurvey\u participant(opts={}),该方法使用类变量和关联来扩展它们。为了测试TestModel扩展,我需要在提供不同选项的不同和连续RSpec上下文中多次初始化它。为此,我需要取消定义TestModel,否则它将“记住”旧设置。受以下启发,我在测试前调用以下实用程序方法: 没关系 问题出在这里。我的引擎有一个模型(SurveyPartic

我正在为RubyonRails引擎编写Rspec测试。我的引擎为ActiveRecord模型提供了一个类方法
is\u a\u limesurvey\u participant(opts={})
,该方法使用类变量和关联来扩展它们。为了测试TestModel扩展,我需要在提供不同选项的不同和连续RSpec上下文中多次初始化它。为此,我需要取消定义TestModel,否则它将“记住”旧设置。受以下启发,我在测试前调用以下实用程序方法:

没关系

问题出在这里。我的引擎有一个模型(SurveyParticipation),它需要与我的主应用程序TestModel关联。我在我的is_a_limesurvey_参与者方法中这样做:

def is_a_limesurvey_participant(opts = {})

  # ... class variables definitions

  has_many :survey_participations, :class_name => "LimesurveyRails::SurveyParticipation", :foreign_key => "participant_id"

  LimesurveyRails::SurveyParticipation.belongs_to :participant, :class_name => self.name, :foreign_key => 'participant_id' 

  puts (LimesurveyRails::SurveyParticipation.reflect_on_association(:participant).klass.object_id == self.object_id)

end
我希望每次我的TestModel调用是\u a\u limesurvey\u参与者方法时,puts调用总是为任何示例显示true,因为LimesurveyRails::SurveyParticipation.reflect\u on\u association(:Participatent)。klass应该是当前的TestModel,如果我单独运行测试也是如此

但同时运行测试表明,LimesurveyRails::SurveyParticipation.reflect_on_association(:participant)。klass始终引用相同的TestModel对象,即Rspec第一次运行时的当前对象是_a_limesurvey_participant方法

如果我尝试按对象id检索这两个对象,我可以看到它们都存在于ObjectSpace中:

(rdb:1) ObjectSpace._id2ref(70222826866840)
TestModel(id: integer, name: string, surname: string, email_address: string, extra_id: string, created_at: datetime, updated_at: datetime)
(rdb:1) ObjectSpace._id2ref(70222827277420)
TestModel(id: integer, name: string, surname: string, email_address: string, extra_id: string, created_at: datetime, updated_at: datetime)
我还尝试为LimesurveyRails::SurveyParticipation类执行相同的重置\u测试\u模型技巧,但即使它被替换,在:participatent关联中引用的类也不会发生同样的情况

 reflect_on_all_associations.first.klass.object_id 
 -->
 reflect_on_association(:belongs_to).klass.object_id

在第一次调用之后,检索第一个/错误的/取消的/未引用的TestModel。除了这种情况之外,使用Rspec测试不同类配置的好模式是什么?当然,单独运行测试可以使所有工作正常,这是正确的模式吗?

我不明白为什么要使用如此困难的方法来创建和销毁对象(通过:删除常量和文件加载)。Ruby有一个垃圾收集器,所以只需使用TestModel.new.is_\u limesurvey_参与者(opts={different\u options})创建对象,就可以了,不用担心销毁它们

至于puts,它应该总是打印为true:我认为LimesurveyRails::SurveyParticipation的所有反射关联(反射所有关联)数组不会总是返回当前对象的第一个元素

LimesurveyRails::SurveyParticipation.reflect_on_all_associations.first.klass.object_id
当您运行单独的测试时,关联数组(rails加载到内存后)只有一个元素,并在所有关联上反映。但是对于下一个测试,第一个元素将不是实际的

一个可能的解决方案是,尝试将reflect_on_all_关联更改为reflect_on_关联

 reflect_on_all_associations.first.klass.object_id 
 -->
 reflect_on_association(:belongs_to).klass.object_id

嗨,这是我所知道的唯一一种困难的方法,它工作得非常完美。无论如何,我要修改我的问题,使它更清楚。关于puts,这只是一个调试打印,您可能指的是
LimesurveyRails::SurveyParticipation。反思协会(:参与者)
。。我打算将其编辑为,但我知道我的LimesurveyRails::SurveyParticipation类只有一个associationHi,因此可能是关联缓存问题(),请尝试使用true选项放弃关联的缓存副本:LimesurveyRails::SurveyParticipation.participation(true).object\u id==self.object\u id谢谢您的关注,但您提到的是类实例,而不是类。还有一个错误/打字错误。。不能在类中调用参与者(true)。。它是一个返回实例的实例方法。我通过玩对象id来找出在关联中使用的类。这是我的荣幸。也许我不太明白这个问题。