超测.expect(200) vs. res.status.should.equal(200);

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

这两个目的是一样的吗?为什么它们都用于例如本教程 https://codeforgeek.com/2015/07/unit-testing-nodejs-application-using-mocha/ ?

编辑,看下面代码:

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();
    });
  });

});

是否有必要

.expect(200)

res.status.should.equal(200);

?有什么区别?

从技术上讲没有区别,我认为你应该坚持 .expect(200) 就像超级测试示例建议的那样:https://github.com/visionmedia/supertest

.expect(200) 部分使用超级测试工具来验证数据。 object.should.equal(value) 部分使用 shouldJS 进行验证。

我更喜欢在 .end() 中使用 shouldJS,因为它允许我根据需要进行一些数据操作、测试、日志记录等。

请注意以下内容: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.

因此,在您上面显示的示例代码中,如果 .expect("Content-type",/json/).expect(200) 失败,则 .end() 中没有任何内容可以捕获它。一个更好的例子是:

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();
      });
  });

});

更新以回答评论中的问题并在此处提供更漂亮的回复:

问题:像 .expect(200, done) 这样的操作会捕获错误吗?

答案:简短的回答是,"Yes"。在我上面引用的同一页上,它具有以下内容:

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); 
  }); 
});