在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
关键在于我们不必在每个result
块中计算it
。
我的问题是:在Javascript的世界中,是否有提供等效功能的库或框架?
我习惯用Jasmine写作,但我没有和它结婚,如果它有我正在寻找的懒惰评估功能,可以使用Mocha或其他东西。
我怀疑有一种方法可以通过beforeEach
和function () {...}
声明及类似事件的冗长卷积来实现,但理想情况下提出的解决方案会有一个漂亮,简洁和优雅的语法。 / p>
我知道jasmine-let,但它已有4年历史,没有维护,看起来不像是一种流行的或官方的工具。此外,我对更现代的Javascript开发相对较新,所以我甚至不知道component install _____
来自哪个工具。
如果我想推出自己的解决方案,这似乎是一篇有用的博文:http://blog.gypsydave5.com/2015/03/21/lazy-eval-and-memo/
哦,如果重要的话,我会提到我在ES6写作。
答案 0 :(得分:4)
如果你正在寻找Jasmine单元测试中的懒惰变量评估,那么有一些很少的选择,但去年有a fork让它与一个名叫Warren的人一起使用v2.3 +欧阳(环球影业)。
Mocha Github上还有a closed issue完全描述了这个场景。有些人发布的示例与功能的特征,替代方案和显式实现相匹配,更像是RSpec。 (请参阅here和here。)
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))
})
})
})
Here's the above example on jsfiddle.net.这使用了更简洁的JavaScript风格。
Here's the previous example of using bdd-lazy-var/rspec on jsfiddle.net
编辑:为简洁起见,请参阅使用CoffeeScript的其他答案。这个答案是JavaScript。
答案 1 :(得分:2)
这是我遇到的一个问题,我对自己找到的可用于此工作的库不满意,所以我建立了自己的库!
https://github.com/enova/givens
具有旨在模仿rspec行为的行为的惰性评估(几乎可以让我将变量作为吸气剂放置在对象上,以使所有内容都包含在内)。
如果您确实愿意,甚至可以将注册函数命名为“ let”,而不是默认的“ give”,以使其更像rspec。
答案 2 :(得分:1)
好吧,既然你想要简洁,你可能实际上并不想要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
Here's the link to run the test at jsfiddle.net.
Here是在CoffeeScript中重写的另一个答案,它编译为JavaScript。它编译成大致相同的东西。 Here是js2coffee上编译结果的链接。
编辑:让它更像是一个不同的答案。