nodejs - 使用nock模拟YQL请求

时间:2015-08-27 11:20:10

标签: node.js mocking yql

我正在尝试为脚本编写一些单元测试,但我似乎无法让YQLnock一起工作。使用nock我可以模拟http请求没有问题,如下面的示例所示,但yql的测试失败,yql总是不会产生任何结果,无论什么我使用(我也在查询中尝试过xpath)。

var http = require('http'),
    nock = require('nock'),
    yql = require('yql')

/**
 * Mock request & test with http
 */
var api = nock("http://example.tld")
    .get("/foobar/")
    .reply(200, "<html><body><table><tr><td class=\"tablebody\"><a href=\"#\">link</a></td></tr></table></body></html>")

http.get("http://example.tld/foobar/", function(resp){
    var str = "";

    resp.on("data", function(data){ str+=data})
    resp.on("end", function(){
        console.log("Got Result: ", str)
    })
})


/**
 * Mock request and test with YQL
 */
var api = nock("http://example.tld")
    .get("/foobar/")
    .reply(200, "<html><body><table><tr><td class=\"tablebody\"><a href=\"#\">link</a></td></tr></table></body></html>")

var query = new yql('select * from html where url="http://example.tld/foobar/"')
query.exec(function(err, results){

    console.log(results)
})

我想知道这是一个标题问题,但我尝试过的任何事情都没有产生yql的结果。   - 任何和所有帮助非常感谢,daithi

1 个答案:

答案 0 :(得分:0)

似乎nock双重转义了网址,这对我来说是个问题,因为网址包含转义的网址。

最后我使用了proxyquire,这使我可以存根yql.exec。所以yql的单元测试现在看起来像:

var json = JSON.parse(fs.readFileSync('expectedResult.json', 'utf8'))
    yqlStub = function(query){
        return {
            exec: function(fn){
                fn(null, json)
            }
        }
    },
    myModule = proxyrequire('lib/myModule.js', {'yql', yqlStub})

myModule.run("http://example.tld", function(err, result){
    //test result here
})