在Ruby的Kernel类中添加assert()方法是否是惯用的Ruby?
时间:2020-03-06 14:51:58 来源:igfitidea点击:
我通过在Ruby中编码等效于Kent Beck的xUnit来扩展我对Ruby的理解。 Python(由Kent编写)以广泛使用的语言提供了assert()方法。 Ruby没有。我认为添加它应该很容易,但是Kernel是放置它的正确位置吗?
顺便说一句,我知道Ruby中存在各种Unit框架,这是一种学习Ruby习惯用法的练习,而不是"完成某些工作"。
解决方案
我们将assert方法添加到内核模块的原因是什么?为什么不只使用另一个名为" Assertions"的模块呢?
像这样:
module Assertions def assert(param) # do something with param end # define more assertions here end
如果我们确实需要断言在任何地方都可以使用,请执行以下操作:
class Object include Assertions end
免责声明:我没有测试代码,但原则上我会这样做。
我的理解是,我们正在编写自己的测试套件,以更加熟悉Ruby。因此,尽管Test :: Unit可能对指导有用,但它可能并不是我们想要的(因为它已经完成了工作)。
就是说,python的assert(至少对我而言)与C的assert(3)更相似。它不是专门为单元测试而设计的,而是用来捕获"绝不应该发生"的情况。
Ruby的内置单元测试如何看待这个问题,那么,每个单独的测试用例类都是TestCase的子类,并且包含一个"断言"语句,该语句检查传递给它的内容的有效性并记录该内容。报告。
不,这不是最佳做法。 Ruby中对assert()的最好的类比只是在提高
raise "This is wrong" unless expr
如果我们想提供更具体的异常处理,则可以实现自己的异常
这不是特别习惯,但我认为这是个好主意。特别是如果这样做:
def assert(msg=nil) if DEBUG raise msg || "Assertion failed!" unless yield end end
这样一来,如果我们决定不使用DEBUG(或者其他方便的开关,我以前使用过Kernel.do_assert)设置,则不会产生任何影响。