Cannot unit test my model in sailsjs

2019-03-29 07:35发布

问题:

For my sails app I'm using the following code to unit test the User model but got the error message:

'TypeError: Object # has no method 'create''

var User = require('../../api/models/User');
var Sails = require('sails');

console.log(User);

describe("User Model:", function() {  

  // create a variable to hold the instantiated sails server
  var app;

  // Global before hook
  before(function(done) {

    // Lift Sails and start the server
    Sails.lift({

      log: {
        level: 'error'
      },

    }, function(err, sails) {
      app = sails;
      done(err, sails);
    });
  });

  // Global after hook
  after(function(done) {
    app.lower(done);
  });

  describe("Password encryption", function() {

    describe("for a new user", function() {
      var user;
      before(function (cb) {
        var userData = {
          email: "testuser@sails.com",
          password: "test_password",
          passwordConfirmation: "test_password"
        };

        User.create(userData, function (err, newUser) {
          if (err) return cb(err);
          user = newUser;
          cb();
        });
      });

      it("must encrypt the password", function() {
        user.must.have.property('encryptedPassword');
        user.must.not.have.property('password');
        user.must.not.have.property('passwordConfirmation');
      });

      after(function (cb){
        user.destroy(function (err) {
          cb(err);
        });
      });
  });

As it seems to me that sails is correctly lifted, what is the problem causing the create method not to be available ?

回答1:

Remove the first line:

var User = require('../../api/models/User');

Once Sails app is lifted, you will have your models available automatically, see here, for example.

And in your case, your first line overrides the User model which would be otherwise constructed by Sails.js, that's why even though you have an object it's not a Waterline model.