2016-01-05 61 views
0

是否可以嘲笑在非spec文件的文件中使用的猫鼬方法?我希望能够在这样similiar模拟操作这个例子:使用Sinon嘲笑猫鼬

型号/ user.js的:

userSchema.statics.SetUsername = function (userId, username, callback) { 
     instance.findOneAndUpdate({ UserId: userId }, 
      { $set: { Name: username } }, 
      { new: true }, 
      function (error, doc) { 
       if (error) { 
        logger.error(error); 
        callback({ error: error }); 
       } else { 
        callback(doc); 
       } 
      }) 
     } 

规格/ userSpec.js:

describe("User module", function() { 
var User = require('../models/User'); 
var UserMock = sinon.mock(User); 
UserMock 
.expects('findOneAndUpdate').withArgs({UserId: 9 },{ $set: { Name: 'Lol'}},{ new: true }) 
.yields(null, {UserId: 9, Username: 'Lol'}); 

describe("POST /setUsername", function() { 
    it("returns status code 200", function (done) { 
     request.post({ 
      url: setUsernameUrl, 
      qs: { userId: '9', username: 'Lol' } 
     }, function (error, response, body) { 
      expect(response.statusCode).toBe(200); 
      done(); 
     }); 
    }); 
}); 

这不工作,findOneAndUpdate里面的SetUsername功能不会被嘲笑起来。

如果这通常是一个坏主意,你能否提出另一种方法?

@ EDIT: 我想我明白为什么这没有任何意义。现在我正在寻找一种通过从测试中调用它们来测试唯一猫鼬方法的方法,而不是通过向测试服务器发送请求。该测试是这样的:

it("returns document", function (done) { 
      User.SetUsername(9, 'Lol', function (result) { 
       expect(result).not.toBeNull(); 
       expect(result.UserId).toBe(9); 
       expect(result.Username).toBe('Lol'); 
       done(); 
      }) 
}); 

回答

0

嗯,所以我只是忘记嘲笑使用数据库连接(这会导致错误的另一种方法:。超时这个答案适用于问题的编辑后的版本