3

私は、Ruby と Rspec に関してかなり幅広いバックグラウンドを持っています。しかし、Node と Mocha を学習していると、理解できない構文に出くわしました。

このチュートリアルを例として使用すると、ルートのテストは次のようになります (CoffeeScript を使用)。また、モカを初心者に説明する次の例を他の多くの場所で見たことにも注意してください。

require "should"
routes = require "../routes/index"

describe "routes", ->

  describe "index", ->

    it "should display index with posts", ->
      req = null
      res =
        render: (view, vars) ->
          view.should.equal 'index'
          vars.title.should.equal('My Coffeepress Blog')
      routes.index(req, res)

私の理解が正しければ、このテストはモックのリクエスト変数とレスポンス変数 (それぞれ req と res) を設定し、routes.index() 関数に送信します。

ただし、私が理解していないのは、render() 関数呼び出しでアサーションを行う理由と方法です。これは、データを設定し、期待値に対してそのデータをテストし、データを破棄することに慣れているため、テストに対するまったく異なるアプローチのようです。ここでは、「データのセットアップ」(モック res オブジェクトの作成) の一部がアサーションを作成しているように見えます。

Rspecに堪能な人にこれを説明できる人はいますか?

4

1 に答える 1

2

関数は、ルートrender内で呼び出されていると思います。indexおそらく次のようになります。

index: (req, res, next) ->
    res.render 'index', { title: 'My Coffeepress Blog'}

メソッドを公開するスタブ応答を渡しているrenderため、呼び出しをインターセプトして呼び出しをアサートできます。つまり、最初の引数 (viewパラメーター) とデータ (varsオブジェクト) です。それを超えると、もちろん基礎となるフレームワークをテストすることになるため、必要なのはこれだけです。

コールバックでアサーションを行うと、コードが top=>down を読み取らないため、「逆さま」に見えるテストになることがよくあります。ただし、これは非同期/コールバックの世界での生活です。

煩わしい場合は、ローカル変数で呼び出しをキャプチャし、事後にアサーションを行うことができますが、しばらくコールバックをコーディングしていると、これは不必要に冗長になり始めます。

# snip
viewName = null
locals = null
res: 
    render: (view, vars) > 
        viewName = view
        locals = vars
routes.index (req, res)
viewName.should.equal 'index'
locals.title.should.equal 'My Coffeepress Blog'

それは役に立ちますか?

于 2012-08-27T04:07:53.593 に答える