相当于Ruby的rspec的Javascript测试允许

时间:2016-09-09 13:49:58

标签: javascript testing

在Ruby世界中,使用rspec,我们有一个名为lethttps://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或其他东西。

我怀疑有一种方法可以通过beforeEachfunction () {...}声明及类似事件的冗长卷积来实现,但理想情况下提出的解决方案会有一个漂亮,简洁和优雅的语法。 / p>

我知道jasmine-let,但它已有4年历史,没有维护,看起来不像是一种流行的或官方的工具。此外,我对更现代的Javascript开发相对较新,所以我甚至不知道component install _____来自哪个工具。

如果我想推出自己的解决方案,这似乎是一篇有用的博文:http://blog.gypsydave5.com/2015/03/21/lazy-eval-and-memo/

哦,如果重要的话,我会提到我在ES6写作。

3 个答案:

答案 0 :(得分:4)

如果你正在寻找Jasmine单元测试中的懒惰变量评估,那么有一些很少的选择,但去年有a fork让它与一个名叫Warren的人一起使用v2.3 +欧阳(环球影业)。

Mocha Github上还有a closed issue完全描述了这个场景。有些人发布的示例与功能的特征,替代方案和显式实现相匹配,更像是RSpec。 (请参阅herehere。)

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。它编译成大致相同的东西。 Herejs2coffee上编译结果的链接。

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