我正在构建一个非常小的宝石来读取图像数据格式,并将图像作为无聊的红宝石数组或漂亮的narray返回,具体取决于a)是否已请求叙述和b)如果可以获得并且需要那个迷彩宝石。我的设计是,如果有人想使用叙述他们可以,但他们必须事先明确地要求它。在读取图像数据时,我检查是否定义了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并且我的警告已成功添加)。
这甚至不值得测试吗?有一个更好的方法吗?任何想法将不胜感激。谢谢,
答案 0 :(得分:2)
定义?不是Object的方法。这就是你的存根不工作的原因。这是一个红宝石运营商。我不确定如何删除运算符。这绝对值得测试,因为它对您的代码的运行很重要。
为了测试这个,你可以从ruby中的$“数组中弹出gem,它包含kernel.load信息并在阻塞之前调用:
Object.send(:remove_const, :NArray)
然后在阻止后你可以重新获得它。也许有一种更好的方法可能有点迟钝。