我正在构建一个非常小的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,是否定义为false且成功添加了我的警告)。

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

最佳答案

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

要测试这一点,您可以将宝石从$“数组中弹出到ruby中,该数组具有kernel.load信息,并在before块中调用:

Object.send(:remove_const, :NArray)


然后在after块中,您可以重新请求它。有点黑,也许有更好的方法。

10-08 14:02