模拟外部依赖

时间:2012-01-19 15:34:18

标签: javascript node.js express mocha

//user.js

couchdb = require('couchdb');

exports.create = function(req, res){

  user = req.body

  if( validate(user) ) {

    couchdb('db').insert(user);
    //redirect

  } else {

    //render new again with the user

  };

};

我想测试上面的函数是否创建了一个用户。

//user_spec.js

describe('User create', function(){

  beforeEach( function(){
    //call create with valid user
  });

  it('should create a user', function(){

    //test database for user
    assert( fakeDatabase.users.length, 1)

  });

})

有没有人知道用假的替换couchdb对象的方法,所以我可以测试是否创建了用户。我真的不想在单元测试中调用真正的couchdb。

2 个答案:

答案 0 :(得分:1)

找到了几个解决方案。第一个是明确地向模块添加依赖项。

module.exports = function(dependency){
   var dependency = dependency | require('dependency');
};

在此处找到此解决方案:http://csausdev.wordpress.com/2010/12/17/dependency-injection-in-node-js/

我发现第二个是使用自定义文件加载器加载文件并以这种方式替换模块。这里解释一下:http://howtonode.org/testing-private-state-and-mocking-deps

答案 1 :(得分:1)

试试nock。您可以模拟http(s)请求,但是您必须跟踪自己添加的用户。

var scope = nock('http://myapp.iriscouch.com')
                .get('/')
                .reply(200, {username: 'pgte', email: 'pedro.teixeira@gmail.com', _id: "4324243fsd"});