【问题标题】:Retain values generated during RSpec rake task after the rake task在 rake 任务之后保留 RSpec rake 任务期间生成的值
【发布时间】:2016-10-26 04:01:13
【问题描述】:

我有一个类似如下的课程:

class Foo
  @variable = {}

  class << self
    attr_accessor :variable
  end

  def self.run(file)
    # do stuff
  end
end

我有一个 RSpec 类型的方法,如下所示:

def method?
  Foo.variable[@name] = {}
  Foo.variable[@name][:variable_two] = 'string'

  true
end

我有一个 rspec 和自定义任务,如下所示:

RSpec::Core::RakeTask.new("rspec-#{spec}".to_sym) do |task|
  task.pattern = spec
end

desc "do stuff"
task spec do
  Rake::Task["rspec-#{spec}".to_sym].invoke
  Foo.run(spec)
end

我正在使用 rake 执行 spec 任务。

如果我在method? 定义中执行puts Foo.variable,那么我看到在"rspec-#{spec}".to_sym 的RSpec 子任务期间,Foo.variable 散列被完全和完美地填充,正如我所期望的那样。但是,一旦Foo.run 在 rspec rake 任务之后执行,Foo.variable 哈希就会变为空。我尝试了许多不同的方法来将 rspec rake 任务期间生成的值传输或保留到 Foo.run 方法,上面的代码基本上是我每次尝试后返回的模板。

哪种算法让我能够在 rspec rake 任务期间保留分配给变量的值,以供之后执行的另一个方法使用?


尝试过的类变量建议:

class Foo
  @@variable = {}

  def self.variable
    @@variable
  end

  def self.run(file)
    # do stuff
  end
end

同样的问题。

【问题讨论】:

  • 这是一个非常奇特的类定义。如果您使用实例,您的initialize 在哪里?如果不是,请尝试使用cattr_accessor 来定义它。
  • 我没有该类的实例。我刚刚搜索了cattr_accessor,因为我从未听说过它并找出原因:它是rails。这只是红宝石。
  • 如果你有一个没有实例的类,那么你想要的是modulemattr_accessorattr_accessor 类似,但用于模块。这些在 ActiveSupport 中,但也提供独立版本。

标签: ruby rspec rake


【解决方案1】:

我想你可能正在寻找一个类变量。类似于

class Foo
  @@bar = 0

  def increment
    @@bar += 1
  end

  def bar
    @@bar
  end
end

f = Foo.new
f.bar
=> 0

f.increment
f.bar
=> 1

g = Foo.new
g.bar
=> 1

g.increment
g.bar
=> 2

f.bar
=> 2

类变量,用双@(本例中为@@bar)表示,一般认为是bad practice,所以使用时请注意。

【讨论】:

  • 试过了,还是有同样的问题。不过感谢您的建议。
猜你喜欢
  • 2016-02-22
  • 2015-12-29
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 2013-06-15
  • 2011-10-17
相关资源
最近更新 更多