举个例子,假设我们正在构建一个简单的缓存。我们可以使用闭包来使用函数方法:
makeCache = ->
c = {}
(key, fetch) ->
if c[key]
c[key]
else
c[key] = fetch()
c[key]
cache = makeCache()
cache(1, -> 1)我发现这种方法的问题是您不能很容易地测试它。我希望能够检查'1'是否在缓存中。如果我添加了更多的值,我希望确保它们也在缓存中。
如果我有一个更复杂的缓存,比如LRU缓存,我也想测试其他方面。然而,这些变量完全隐藏在闭包后面。
我倾向于想出使用闭包的解决方案,但随后我求助于面向对象的风格,以便它的可测试性:
class Cache
constructor: ->
@c = {}
get: (key, fetch) ->
if c[key]
c[key]
else
c[key] = fetch()
c[key]
cache = new Cache()
cache.get(1, ->1)现在,我可以访问cache.c和需要检查的任何其他变量来进行测试。
因此,我的问题是,在使用函数样式闭包时,如何测试代码?
发布于 2015-04-08 19:56:08
这不是检验你的具体情况吗?
cache = new Cache()
cache.get(1, ->1)
expect(cache.get(1, ->0)).toBe(1);更普遍的问题是足够真实的。但任何封装技术都是如此。不过,我认为,测试的整个目标,或者至少是单元测试,是为了工作一个系统的公共接口。因此,如果您没有公共工具来检查缓存中是否存在某种东西,那么您就不需要对其进行单元测试。
当然,有些人不同意这一点,但我认为这是一条鲜明的分界线。
https://stackoverflow.com/questions/29523951
复制相似问题