Mocha + supertest + assert: распечатать тело ответа при ошибке теста

Я использую mocha, supertest и assert для тестирования своего Express-приложения. Приложение My 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()

Как мне заставить мокко распечатать res.body, но только если тест не прошел? Я бы предпочел не помещать что-то вроде console.log(res.body) if test.failed в каждый describe блок, если это возможно.


person Charles    schedule 17.08.2014    source источник


Ответы (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;). Я должен делать это один раз в каждом тесте, но тогда мне не нужно беспокоиться, когда и где это не удается. Раньше мне приходилось быть осторожным, потому что, если тест не удался, некоторый код ниже не будет выполнен, поэтому он даже не достигнет оператора печати. Таким образом я сохраняю то, что мне нужно, независимо от результата.

Затем после каждого теста это afterEach событие запускается и проверяет, прошел ли тест или нет.

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

Это обеспечивает единообразный способ печати для каждого теста. Это всего лишь одна строка для всех тестов, поэтому легко изменить формат или отключить, и мне не нужно заботиться о том, где тест не удался, я просто забочусь о конечном результате. Мне кажется, что это лучший и самый простой подход из всех ленивых подходов. Даже выходной JSON отображается красиво и красочно. Вероятно, есть более правильный способ справиться с этим, но это приятный и ленивый подход.

person Anton Krug    schedule 26.04.2016

Несколько способов добиться этого:

Вариант 1: я бы просто использовал условие if, чтобы проверить условие сбоя в блоке else и сделать console.log (res.body)

Вариант 2: или в функции обратного вызова, если есть ошибка, вы можете вернуть res.body.

Eg:

В конце используйте что-то вроде ниже

.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 вместо res.body.password

Попробуйте, это должно сработать.

person swathy valluri    schedule 18.09.2014