【问题标题】:Mock backend in nightwatch.js testsnightwatch.js 测试中的模拟后端
【发布时间】:2017-09-12 18:38:20
【问题描述】:

在我的 Vue.js 应用程序中,我使用 nightwatch 来测试我的应用程序。我有以下规格:

module.exports = {
  'wrong email or password': function (browser) {
    const devServer = browser.globals.devServerURL
    var nock = require('nock');

    var couchdb = nock('http://localhost:3000/')
                    .get('api/v1/login')
                    .reply(401, {
                      error: 'dupa'
                     });

    browser
      .url(devServer + '/login')
      .setValue('input[type=email]', 'email@example.com')
      .setValue('input[type=password]', 'password')
      .click('.login')
      .assert.containsText('#app', 'Niepoprawny email lub hasło.')
      .end()
  }
}

在我的测试中,我尝试使用https://github.com/node-nock/nock。但不幸的是,这并没有模拟任何请求。我做错了什么?

【问题讨论】:

  • 我没有一个好的答案,但 Nock 不起作用的原因是它取代了 node 的 http 函数。但是 Nightwatch 是在类似浏览器的环境中运行的,而不是 node 的,所以 Nock 没有效果。
  • 如前所述,Nock 是用于测试服务器端代码的。由于这里的服务器端不涉及真正的服务器并且不利于测试一致性,我建议改为在客户端模拟请求,例如使用 Sinon,sinonjs.org/releases/v3.2.1/fake-xhr-and-server

标签: javascript ecmascript-6 vue.js nightwatch.js


【解决方案1】:

Nock 取代了运行它的浏览器环境中的 HTTP 机制。 由于您在测试中运行它,而不是在浏览器中运行,因此浏览器环境没有变化。

您可以做几件事,但这取决于您要达到的目标:

  1. 您可以编写一个假服务器并让它在端口 3000 上侦听并以您喜欢的任何方式回答。
  2. 您可以配置您的应用程序以根据配置使用不同的机制,并让它在测试中加载 Nock“策略”。
  3. 如果您有其他测试检查 UI,您可以用单元测试和集成测试替换此测试,以针对执行实际请求的功能。

要写一个假的,你只需要一个简单的服务器来返回你想要的答案。这是 express.js 的示例:

const express = require('express')
const app = express()

app.get('/api/v1/login', function (req, res) {
  res.send('Some response')
})

app.listen(3000, function () {
  console.log('server listening on port 3000')
})

【讨论】:

  • 有夜班的例子吗?我无法找到如何在 nightwatch 中模拟 api 后端的好例子......
  • Nightwatch 不提供此功能。它基本上是一个 WebDriver 实现(Selenium)。要运行假后端,您需要编写一个。如果你用 node 和 express.js 来做,几行代码就可以完成。
猜你喜欢
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
相关资源
最近更新 更多