Javascript测试相当于Ruby的rspec let



在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或其他东西。

我怀疑有一种方法可以用beforeEachfunction () {...}声明之类的冗长的卷积来做到这一点,但理想的解决方案应该有一个漂亮、简洁和优雅的语法。

我知道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上的编译结果链接。

编辑:让它更像一个不同的答案

最新更新