7

Express アプリをテストするために mocha、supertest、および assert を使用しています。Express アプリは開発モードで実行されるため、リクエストが失敗するたびに有用なデバッグ情報が JSON として返されます。このデータをテスト スイートで印刷したいのですが、テストが失敗した場合に限ります。私のテストの例 (CoffeeScript):

  assert  = require "assert"
  request = require "supertest"
  url     = request "http://localhost:3000"

  describe "GET /user/:id", ->
    it "should return one user", (done) ->
      url
        .get("/user" + id)
        .expect(200)
        .expect("Content-Type", /json/)
        .end (err, res) ->
          if err
            done err
          else
            # assuming the test reaches here, but fails on one of the following,
            # how do i make mocha print res.body?
            assert.equal(res.body.name, user.name)
            assert.equal(res.body.email, user.email)
            done()

mocha print res.bodyを作成するにはどうすればよいですか?ただし、テストが失敗した場合のみですか? 可能であればconsole.log(res.body) if test.failed、各ブロックに次のようなものを配置する必要はありません。describe

4

2 に答える 2

2

私も同様にそれを行います:

var supertest = require("supertest");
var should    = require("should");
var util      = require('util');

describe("My test",function(){

  var response;

  it("should validate the API key",function(done){
    server
    .post("/validate")
    .set('authorization', apiKey)
    .expect("Content-type",/json/)
    .expect(200) 
    .end(function(err,res){
      response = res;
      res.status.should.equal(200);
      res.body.error.should.equal(false);
      done();
    });
  });

  afterEach(function(){
    if (this.currentTest.state == 'failed') { 
      console.log("    Response body: " + util.inspect(response.body,{depth: null, colors: true}) + "\n");
    }
  })  

});

私は自分のテスト スコープで変数を専用にしresponse、各テストはそれを指定された応答 ( response = res;) に設定します。各テストで 1 回実行する必要がありますが、いつ、どこで失敗するかを心配する必要はありません。以前は注意が必要でした。テストが失敗すると、その下のコードが実行されず、print ステートメントに到達しなくなるからです。このようにして、結果がどうであれ、必要なものを保存します。

その後、各テストの後、このafterEachイベントが開始され、テストが成功したか失敗したかがチェックされます。

  afterEach(function(){
    if (this.currentTest.state == 'failed') { 
      console.log("    Response body: " + util.inspect(response.body,{depth: null, colors: true}) + "\n");
    }
  })  

これにより、テストごとに一貫した印刷方法が提供されます。すべてのテストで 1 行だけなので、フォーマットを変更したり無効にしたりするのは簡単です。また、どこでテストが失敗したかを気にする必要はなく、最終的な結果だけを気にする必要があります。これは、すべての怠惰なアプローチの中で、最善かつ最も簡単なアプローチのように思えます。出力された JSON も美しくカラフルに表示されます。これを処理するもっと適切な方法があるかもしれませんが、これは良い、怠惰なアプローチです。

于 2016-04-26T14:10:53.170 に答える
1

これを達成するための複数の方法:

オプション 1 : if 条件を使用して、else ブロックで失敗した条件を確認し、console.log(res.body) を実行します。

オプション 2: またはコールバック関数で、エラーが発生した場合は res.body を返すことができます。

例えば:

最後に以下のようなものを使用してください

.end(function(err, res){
        if (err) throw err;
        if (!res.body.password) assert.fail(res.body.password, "valid password", "Invalid password") 
        else done()
    }); 

res.body.password の代わりに res.body を使用することもできます

これを試してみてください。

于 2014-09-18T09:30:43.567 に答える