2

我正在构建一个非常小的 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 并且我的警告已成功添加)。

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

4

1 回答 1

2

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

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

Object.send(:remove_const, :NArray)

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

于 2011-01-28T17:07:23.433 回答