0

我想知道您是否经历过“nock”模块拦截http请求但没有任何日志记录就停止的情况……至少在我看来。我可能错了。这是测试:

...
suite('Successful SAVE: ', function(){
    setup(function(){
        domain = new Domain({attrOne:1, attrTwo:2});
        minDriver = nock('http://localhost:3002')
            .log(console.log)
            .filteringRequestBody(function(path) {
                return '*';
            })
            .post('/minnehaha/api/review/', '*')
            .reply(201, {ok: true, id: ID, version: VER});
    });

    suite('saving domain', function(){
...
        test('saving review...', function(done){
             //the domain module makes http POST request
             domain.save(function(err){
                if(err){
                    console.log("Error saving: " + err.message);
                }
            });
            done();
        });

...

如您所见,Nock 的日志记录已打开,但它没有记录任何内容。模块在 test - domain 中发出的 HTTP 请求被拦截,这意味着它没有到达实际的服务器。res.on('data' or 'end') 不会从模块中的请求中调用:

http = require 'http'

class Domain
    ...    
    save: (fn) ->

            post_data = JSON.stringify(@)

            options =
              host: "localhost"
              port: 3002
              path: "/minnehaha/api/review/"
              method: "POST"
              headers:
                'Content-Type': "application/json"
                'Content-Length': post_data.length

            req = http.request options, (res) ->
              body = ''
              res.setEncoding 'utf8'

              res.on 'data', (chunk) ->
                body += chunk

              res.on 'end', () ->
                newReview = JSON.parse(body)
                return fn null


            req.on 'error', (e) ->
              console.log 'problem with POST Review request to controller: ' + e.message

            req.write post_data + '\n'

module.exports  = Domain

如果关闭 Nock 拦截,则该模块工作(到达服务器并由模块处理响应)。有了这个,我得出结论,问题是箭尾拦截。此外,如果 HTTP POST 请求是从测试文件本身发出的,而不是从模块发出的,它就可以工作……测试文件在 JS 中,但在 CoffeeScript 中的模块……这不重要吗?任何帮助表示赞赏

4

1 回答 1

1

问题是在使用 Nock 时,需要显式结束请求流,如下所示:

   req.write(post_data + '\n');
   req.end();

如果没有“req.end()”,Nock 拦截器将永远不会在响应流上发出“结束”事件,使其挂起。

对于像我这样的 CoffeeScript 新手来说,这还不够

req.end 

这只会编译为“end”函数的引用,而不是调用它。要进行函数调用,这有效:

req.end '\n'

这编译为 'req.end('\n') 并调用 'end' 函数

于 2013-05-27T01:01:35.890 回答