Search code examples
mocha.jssupertest

Supertest .expect(200) vs. res.status.should.equal(200);


Do both of these serve the same purpose? Why are they both used in, for example, this tutorial https://codeforgeek.com/2015/07/unit-testing-nodejs-application-using-mocha/ ?

Edit, Looking at the following code:

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

// This agent refers to PORT where program is runninng.

var server = supertest.agent("http://localhost:3000");

// UNIT test begin

describe("SAMPLE unit test",function(){

  // #1 should return home page

  it("should return home page",function(done){

    // calling home page api
    server
    .get("/")
    .expect("Content-type",/json/)
    .expect(200) // THis is HTTP response
    .end(function(err,res){
      // HTTP status should be 200
      res.status.should.equal(200);
      // Error key should be false.
      res.body.error.should.equal(false);
      done();
    });
  });

});

Is it necessary to have

.expect(200)

and

res.status.should.equal(200);

? What is the difference?


Solution

  • The .expect(200) part is using the supertest facility for verifying data. the object.should.equal(value) part is using shouldJS for verification.

    I prefer utilizing shouldJS in the .end() because it allows me to do a bit of data manipulation, testing, logging, etc, as needed.

    Do note the following from: https://www.npmjs.com/package/supertest

    If you are using the .end() method .expect() assertions that fail will not throw - they will return the assertion as an error to the .end() callback.

    So, in the example code you show above, if .expect("Content-type",/json/) or .expect(200) fails, there is nothing in the .end() to catch it. A better example would be:

    var supertest = require("supertest");
    var should = require("should");
    
    // This agent refers to PORT where program is runninng.
    
    var server = supertest.agent("http://localhost:3000");
    
    // UNIT test begin
    
    describe("SAMPLE unit test",function(){
    
      // #1 should return home page
    
      it("should return home page",function(done){
    
        // calling home page api
        server
          .get("/")
          .expect("Content-type",/json/)
          .expect(200) // THis is HTTP response
          .end(function(err,res){
            // NOTE: The .expect() failures are handled by err and is  
            //       properly passed to done. You may also add logging
            //       or other functionality here, as needed.
            if (err) {
                done(err);
            }
    
            // Error key should be false.
            res.body.error.should.equal(false);
            done();
          });
      });
    
    });
    

    Update to answer the question in the comment and provide a prettier response here:

    Question: Would doing something like .expect(200, done) catch the error then?

    Answer: The short answer is, "Yes". On the same page I quoted above, it has the following:

    Here's an example with mocha, note how you can pass done straight to any of the .expect() calls:

    describe('GET /user', function() { 
      it('respond with json', function(done) { 
        request(app) 
          .get('/user') 
          .set('Accept', 'application/json') 
          .expect('Content-Type', /json/) 
          .expect(200, done); 
      }); 
    });