【问题标题】:Testing execution code with RSpec使用 RSpec 测试执行代码
【发布时间】:2025-11-27 22:40:01
【问题描述】:

我有一段代码要测试,它没有包含在方法中。它只是在 Ruby 类中独立存在。

begin
  # Do stuff - bunch of Ruby code
end

这不是 Rails 应用程序。它是一个独立的 Ruby 类。我不想在我的 rspec 测试中执行整个 begin end 语句。你如何测试这样的东西?应该使用模拟/存根来完成吗?我问了几个人,但他们也不知道答案。

【问题讨论】:

  • 如果你不想测试你的方法的一部分,那么你的方法应该分成两个(或更多)方法。
  • 哦,这根本不是一个方法。它只是一个包含代码的文件末尾的 begin end 语句。所以,它就像:开始一些 Ruby 代码 end
  • 如果你不想让某样东西成为一个代码单元,就不要让它成为一个代码单元。
  • 我明白我误解了你的解释。在这种情况下,将其包装在一个方法中!
  • @Sait:这听起来不像单元测试适合这里。您基本上是在尝试在这里编写某种集成测试。如果它不是一个单元,则无法对其进行单元测试。

标签: ruby rspec rspec2


【解决方案1】:

我发现如果您可以将行为封装在方法或模块中,这更容易测试,但这实际上取决于您尝试执行的代码。如果代码最终以公共方式更改了类,您可以围绕该类在内存中的预期行为这一事实编写测试。例如:

class Foo
  attr_accessor :bar
end

describe Foo
  it "should have an attr_accessor bar" do
    foo = Foo.new
    foo.bar = "baz"
    foo.bar.should == "baz"
  end
end

如果您以私有方式更改课程,这将变得更加困难。

我过去很幸运,将这种类型的行为重写为可以显式调用的方法。它使测试变得更容易,并且在解决问题时更容易理解时间安排。例如:

class Foo
  def self.run
    # do stuff
  end
end

您能否提供更多关于您在课堂上尝试做的事情的背景信息?

【讨论】:

  • 我正在尝试在 begin 和 end 语句之间进行大量文件操作。所以,我正在检查一个文件是否存在,如果是,则执行一段代码,如果它不存在,则执行另一段代码。