在Ruby世界中,使用rspec,我们有一个可用的特性叫做let
(https://relishapp.com/rspec/rspec-core/docs/helper-methods/let-and-let)。它的主要好处是它是惰性求值的,所以我们可以这样编写测试:
describe Thing do
describe "#process" do
let(:arg) { nil }
let(:result) { Thing.new.process(arg) }
context "given 3" do
let(:arg) { 3 }
it "returns 12" do
expect(result).to eq 12
end
end
context "given 7" do
let(:arg) { 7 }
it "returns 42" do
expect(result).to eq 42
end
end
end
end
关键是我们不需要用一行来计算每个it
块中的result
。
我的问题是:在Javascript的世界里,有没有一个库或框架提供了一个等效的功能?
我习惯用Jasmine写作,但我还没有结婚,如果它有我正在寻找的惰性评估功能,我可以使用Mocha或其他东西。
我怀疑有一种方法可以用beforeEach
和function () {...}
声明之类的冗长的卷积来做到这一点,但理想的解决方案应该有一个漂亮、简洁和优雅的语法。
我知道jasmine-let,但它已经4年了,没有维护过,看起来不像一个流行的或官方的工具。此外,我对更现代的Javascript开发相对较新,所以我甚至不知道component install _____
来自哪里(什么工具)。
如果我想提出自己的解决方案,这似乎是一篇有用的博客文章:http://blog.gypsydave5.com/2015/03/21/lazy-eval-and-memo/
哦,如果这很重要,我会提到我是用ES6写的
如果您正在寻找Jasmine单元测试中的惰性变量求值,那么有几个替代方案,但是去年有一个名为Warren Ouyang (globetro)的人制作了一个分支,让它可以在v2.3+中工作。
在Mocha Github上也有一个封闭的问题准确地描述了这个场景。一些人已经发布了与该特性、替代方案和更像RSpec的显式实现相匹配的示例。(见这里和这里)
describe('Thing', () => {
def('arg', () => null )
return describe('process', () => {
def('process', () => new Thing().process($arg) )
context('given 3', () => {
def('arg', () => 3 )
it('returns 12', () => expect($process).to.equal(12))
})
context('given 7', () => {
def('arg', () => 7)
it('returns 42', () => expect($process).to.equal(42))
})
})
})
以下是jsfiddle.net上的上述示例。这使用了一种更简洁的JavaScript风格。
下面是前面在jsfiddle.net上使用bdd-lazy-var/rspec的例子。
编辑:为简洁起见,请参阅使用CoffeeScript的其他答案。
这是我遇到的一个问题,我对我找到的库不满意,所以我自己构建了一个!
https://github.com/enova/givens惰性求值,其行为几乎完全模仿rspec行为(让步是我将变量作为getter放在对象上,以保持包含所有内容)。
你甚至可以将注册函数命名为" let ",而不是默认的" given ",如果你真的想这样做的话,这会使它更像尊重。
好吧,既然你想要简洁,你可能实际上不需要JavaScript。
describe 'Thing', ->
describe 'process', ->
def 'arg', -> null
def 'result', -> new Thing().process($arg)
context 'given 3', ->
def 'arg', -> 3
it 'returns 12', ->
expect($result).to.equal(12)
return
context 'given 7', ->
def 'arg', -> 7
it 'returns 42', ->
expect($result).to.equal(42)
return
这是在jsfiddle.net上运行测试的链接
这里是另一个用CoffeeScript重写的答案,它被编译成JavaScript。它编译成大致相同的东西。下面是js2coffee上的编译结果链接。
编辑:让它更像一个不同的答案