1

Express で単純な JSON API を作成し、モカを使用してブラックボックス テストを実行しようとしています。API を徹底的にテストするには、異なるユーザーとして認証する必要があるため、特定の機能の各テストは、ログイン操作と、実際の機能をテストする 1 つ以上の認証済み要求の少なくとも 2 つの要求で構成されます。

django.test.clientHTTP クライアントとサーバー間のステートフルなやり取りをシミュレートするのに似たライブラリは見つかりませんでした。Supertest は人気があるようですが、django テスト クライアントに比べて非常に低レベルです。これは、簡単な認証済みテストを作成する方法です (私の coffeescript を許してください)。

it 'should return a 200 OK', (done) ->
  supertest(server.app)
    .post('/login')
    .send("username=xxx&password=pass")
    .end (err, res) ->
      res.should.have.status(200)
      supertest(server.app)
        .get('/api/users')
        .set('cookie', res.headers['set-cookie'][0])
        .expect(200, done)

これは本当にインタラクションを実行する最もクリーンな方法ですか? 非同期性(99%のケースでテストの単純なシリアル化以外に何かが必要になるわけではなく、コールバックは混乱するだけです)とステートフルネスに役立つライブラリはありますか?次のようになります。

it 'should rock', (done) -> myCoolLibrary [
  ->
    @post '/login', {username: "xxx", password: "pass"}, (err, res) =>
      res.should.have.status 200
      @done()
  ,
  ->
    @get '/api/users', (err, res) =>
      res.should.have.status 200
      @done()
  ]

似たようなものがなければ、自分で書くべきです :-) コンテキストに依存しているのは、私が最近 ZappaJS を使いすぎているためです。CoffeeScript の太い矢印のおかげで、それはまったく悪いイディオムではありません。

4

3 に答える 3

1

zombiejsの恩恵を受けることができるようです。ブラウザをシミュレートし、リクエスト間で Cookie とセッション データを保持します。

また、たとえば、フォームに記入して送信できるようにするなど、より強力な機能も提供します。

典型的なテストは次のようになります。

var Browser = require('zombie')
  , browser = new Browser({site:'http://yoursite.com'});
describe('page',function(){
    before(function(done){
        browser.visit('/loginpage',done);
    });
    it('should return a 200 page',function(done){
        browser.fill('username','xxx');
        browser.fill('password','pass');
        //assuming your form points to /login
        browser.pressButton('button[type="submit"]'),function(){
            assert(browser.success); //status code is 2xx
        }).then(done,done); //call the done handler after promise is fulfilled
    });
    it('should rock',function(done){
        browser.visit('/api/users',function(){
            assert(browser.success);
        }).then(done,done);
    });
于 2013-04-29T22:51:58.773 に答える
0

非同期コードを読みやすくするためのより一般的な解決策として、async を確認してください。https://github.com/caolan/async

async.serial は必要なことだけを行いますが、async.auto を特にお勧めします。これにより、さまざまなステップとその依存関係を明確な方法でリンクできます。

于 2013-04-29T21:08:00.473 に答える
0

質問の「理想的な」例にかなり近い小さなライブラリを自分で作成することになりました。今のところ、独自のパッケージに値するものではないので、要旨に入れました:

https://gist.github.com/BruceBerry/5485917

スーパーエージェントとスーパーテストにステートフルな対話を実行させることができなかったので、リクエストを優先してそれらを捨てました。主な違いは、expect をチェーンできないことと、コールバックですべてのテストを実行する必要があることですが、should.js などの別のテスト ライブラリを既に使用している場合、それらは奇妙に見えます。

于 2013-04-30T00:52:29.587 に答える