2016-01-05 72 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

嗯,所以我只是忘記嘲笑使用數據庫連接(這會導致錯誤的另一種方法:。超時這個答案適用於問題的編輯後的版本