Unit Test with Mongoose

前端 未结 4 1748
渐次进展
渐次进展 2021-01-01 17:21

I\'m new to Node.js, Mongoose, and testing in this environment. I have the following schema declared in a separate file.

Issue = mongoose.model(\"Issue\", {         


        
相关标签:
4条回答
  • 2021-01-01 18:14

    I'm not sure how to test the Content-Type, and I haven't tested this code myself, but I'm happy to help out if it doesn't work. It seems to make sense to me. Basically we just created a callback so we could move the response.send out of the actual custom logic, then we can test via that callback. Let me know if it doesn't work or make sense. You can use the links that the other guys posted to prevent having to connect to the db.

    Issue = mongoose.model("Issue", {
        identifier: String,
        date: String,
        url: String,    
        name: String,
        thumbnailURL: String
      });
    
      function issues(callback, request, response) {
        Issue.find().sort('number').exec(function(error, items) {
          if (error) {
            callback(403, {"status": "error", "error:": exception});
          }
          else {
            callback(200, {"issues": items});
          }
        });
      }
    
      //Note: probably don't need to make a whole new `sender` function - depends on your taste
      function sender(statusCode, obj) {
        response.setHeader('Content-Type', 'text/json');
        response.send(statusCode, obj);
      }
    
      //Then, when you want to implement issues
      issues(sender, request, response);
    
      //The tests - will depend on your style and test framework, but you get the idea
      function test() {
        //The 200 response
        issues(function(code, obj) {
          assert(code === 200);
          assert(obj.issues === ??);   //some testable value, or just do a truthy test
          //Here, you can also compare the obj.issues item to the proper date-sorted value
        });
    
        //The error response
        issues(function(code, obj) {
          assert(code === 403);
          assert(code.status === 'error');
        });
      }
    
    0 讨论(0)
  • 2021-01-01 18:14

    A good place to start would be:

    1. Investigate the concepts around stubs and mocks, and test doubles.
    2. Check out Sinon.js which is the Mocking framework of choice for Node.JS
    0 讨论(0)
  • 2021-01-01 18:22

    Mongoose model (your Issue) returns a new instance of the Query object. The new query instance has access to the exec method through the prototype. (mongoose 3.8~)

    If you want to return an error you can write:

    sinon.stub(mongoose.Query.prototype, "exec").yields({ name: "MongoError" }, null);
    
    0 讨论(0)
  • 2021-01-01 18:24

    Using mocha with chaijs and sinonjs in my node code something like this method works for me:

    var should = require('chai').should(),
    sinon = require('sinon'),
    mongoose = require('mongoose');
    
    it('#issues() handles mongoosejs errors with 403 response code and a JSON error message', function (done) {
    
    // mock request
    var request = {};
    
    // mock response
    var response = {};
    response.setHeader = function(header) {};
    response.send = function (responseCode, jsonObject) {
        responseCode.should.equal(403);
        jsonObject.stats.should.equal('error');
        // add a test for "error:": exception
        done();
    }
    
    var mockFind = {
        sort: function(sortOrder) {
            return this;
        },
        exec: function (callback) {
            callback('Error');
        }
    }
    
    // stub the mongoose find() and return mock find 
    mongoose.Model.find = sinon.stub().returns(mockFind);
    
    // run function
    issues(request, response);
    
    });
    
    0 讨论(0)
提交回复
热议问题