【问题标题】:How to retest same URL using Mocha and Nock?如何使用 Mocha 和 Nock 重新测试相同的 URL?
【发布时间】:2014-08-24 13:04:53
【问题描述】:

我正在使用 Mocha、Chai、Sinon、Proxyquire 和 Nock。

对于这个特定的测试场景(正在询问这个问题),希望多次测试完全相同的 URL,每次都在一个单独的测试中,期望得到不同的响应。

例如,没有商家 Feed、1 个商家 Feed 和 2 个商家 Feed 的响应。

现有代码都可以正常工作,此外,如果我单独运行测试,它们会通过。

但是,如果我在一个套件中使用 Mocha 一起运行它们,它们就会失败。相信问题在于 Nock 劫持了给定 URL 的全局 http 对象,并且每个测试(同时异步运行)都在竞争相同的全局响应引用。

在上述场景中,使用 1 个商家的预设回复准备的响应被设置覆盖以响应 2 个商家等。

是否有避免这种情况发生的机制,例如保证异步 Mocha 测试用例的串行执行(我认为这是默认行为)。

【问题讨论】:

    标签: node.js mocha.js


    【解决方案1】:

    针对您的第 2 点),您可以使用 nock.cleanAll() 清理所有准备好的 nocks:

    https://github.com/pgte/nock#cleanall

    您可以将其放在 afterEach 块中,以确保您在测试之间没有剩余的 nocks。

    afterEach ->
      nock.cleanAll()
    

    【讨论】:

    • 谢谢詹姆斯,我已经这样做了,请查看更新的答案。
    • 我已经尝试过这个解决方案,但它似乎对我不起作用。你能看看吗? stackoverflow.com/questions/59202099/…
    【解决方案2】:

    好的,这样就可以了(示例代码):

     beforeEach(function (done) {
                nock(apiUrl)
                    .get('/dfm/api/v1/feeds?all=false')
                    .reply(200, [
                        {'merchantId': 2, 'id': 2, 'disabled': false}
                    ], { server: 'Apache-Coyote/1.1',
                        'set-cookie': [ 'JSESSIONID=513B77F04A3A3FCA7B0AE1E99B57F237; Path=/dfm/; HttpOnly' ],
                        'content-type': 'application/json;charset=UTF-8',
                        'transfer-encoding': 'chunked',
                        date: 'Thu, 03 Jul 2014 08:46:53 GMT' });
    
                batchProcess = proxyquire('./batchProcess', {
                    './errorHandler': errorHandler.stub,
                    './batchTask': batchTask.stub
                });
    
                winston.info('single valid feed beforeEach completed');
                done();
        });
    

    有很多复杂的因素。有两点需要注意:

    1)。我有异步测试用例,但在没有 done 参数的情况下使用 beforeEach() 。这导致了 URL 冲突。通过明确声明每个 beforeEach(done) 并调用 done() Mocha 将按顺序运行,不再有问题。

    2)。确保如果您在同一个测试套件文件中有多个测试,那么您在之前的测试中设置的任何 Nock 固定装置如果您在后续测试中声明了具有备用响应的相同 URL,那么您将实际执行。如果没有调用先前的 nock 夹具,则 nock STILL 保留来自错误测试(前一个)的响应。这是我的主要问题。您可能会争辩说,如果测试不运行,则不应声明任何固定装置 - 但您也可能会争辩说这仍然是 Nock 工作方式中的一个错误。测试装置各自独立于各自的 describe / beforeEach(done) 函数中。

    2 天后更新...好的第 2 点)。再次咬我,我很高兴我写了上面的注释来提醒自己这个难以调试的问题。如果您同时使用 Mocha 和 Nock,请注意这个问题!

    最终也实现了一个 nock 辅助函数来帮助解决这个问题(此处为咖啡脚本):

    global.resetNock = ->
      global.nock.cleanAll()
      global.nock.disableNetConnect()
    

    然后在 beforeEach 开始时只需应用 resetNock()

    【讨论】:

    • 你好@arcseldon 恭喜你找到了这个令人毛骨悚然的问题的答案。我处于同样的情况stackoverflow.com/questions/46801001/…,如果可能的话,我很想得到你的帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-07-02
    • 2015-12-16
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    相关资源
    最近更新 更多