【问题标题】:Explicitly test whether libraries/gems are defined by stubing in rspec?明确测试库/宝石是否由 rspec 中的存根定义?
【发布时间】:2011-01-28 16:21:30
【问题描述】:

我正在构建一个非常小的 gem 来读取图像数据格式并将图像作为无聊的 ruby​​ 数组或漂亮的narray 返回,这取决于 a) 是否已请求 narray 和 b) 如果narray gem 可用且需要。我的设计是,如果有人想使用 narray 他们可以,但他们必须事先明确要求它。读取图像数据时,我检查是否定义了 narray(已被要求),并简单地向 msg 实例变量添加警告以供以后打印/记录。

我想对此进行测试(我使用 rspec2 和 mocha 进行模拟),但我对实际使用 rspec 有点陌生。我想做类似的事情:

it "should return an narray if requested" do
  obj = NRead.new(@string, :bin => true, :narray => true)
  obj.image_narray.should_not be_nil
end

it "should add an NArray Install message and not set the image_narray if NArray was not available" do
  Object.stubs(:defined?).with(:NArray).returns(:false)
  obj = NRead.new(@string, :bin => true, :narray => true)
  obj.msg.should_not be_empty
  obj.msg.grep(/Please gem install narray/).empty.should be_false
  obj.image_narray.should be_nil
  obj.image_ruby_array.size.should == @fixture_image_length
end

...但我一定错过了使用存根的要点,因为这种存根不会改变定义的行为?不管存根,定义?返回“真实”值(即,如果我取消注释代码中的 require,defined? 为 false 并且我的警告已成功添加)。

这甚至不值得测试吗?有一个更好的方法吗?任何想法将不胜感激。谢谢,

【问题讨论】:

    标签: ruby testing rspec require stub


    【解决方案1】:

    定义?不是对象的方法。这就是为什么您的存根不起作用的原因。它是一个红宝石运算符。我不确定如何剔除操作员。这绝对值得测试,因为它对代码的功能很重要。

    要对此进行测试,您可以将 gem 从具有 kernel.load 信息的 ruby​​ 中的 $" 数组中弹出并在块之前调用:

    Object.send(:remove_const, :NArray)
    

    然后在 after 块中,您可以重新要求它。这有点骇人听闻,也许有更好的方法。

    【讨论】:

    • 嗯,有道理。我已经习惯了运算符作为方法的语法糖,我只是假设这就是正在发生的事情。但这给了我一个想法——我可以添加一个基本上只返回定义的方法?因为我可以存根。我不确定这是否比 .remove_const 少一些骇人听闻的内容,并且它需要更改我的代码只是为了进行测试。我可能会选择你的方法。谢谢!
    • 我在谷歌上搜索了一些存根操作符但一无所获,所以我决定走简单的路线并尝试你的建议;它非常适合我的需要。我同意,有点不礼貌,但总体来说还不错。再次感谢,-Erik
    • 是的,我也进行了一些搜索,但无法找到存根操作符的方法。存根库通常通过打开类来工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    相关资源
    最近更新 更多