Nightwatch 模拟 HTTP 请求

Nightwatch Mock HTTP Requests

我尝试使用 nock 和其他库(如 sinonjs)模拟 HTTP 请求,但没有成功。

import nock from "nock"

const URL = "http://localhost:8080/"

const SIGN_IN_PATH = "/fake/users/sign_in.json"

export const signInRequest = (status, payload = {}) => {
  return nock(URL).get(SIGN_IN_PATH).reply(status, payload)
}

-

import { signInRequest } from "./../../utils/fakeRequests"

const doLogin = (browser) => {
  return browser
          .url("http://localhost:8080")
          .waitForElementVisible('form', 1000)
          .setValue('input[name=email]', 'foo@foo.com')
          .setValue('input[name=password]', 'somepass')
          .click('button[type=submit]')
          .pause(500)
}

export default {
  "Do login and shows error message": (browser) => {
    signInRequest(403)

    doLogin(browser)
      .waitForElementVisible('.error', 1000)
      .end()
  }
}

是否可以使用 nightwatch 模拟 http 请求?

Nightwatch.js 是一个端到端的测试工具——所以重点是实际的 UIs 以及他们调用的 api 将是实时的(而不是模拟的) 因此,也许您正在寻找专为集成测试设计的框架,例如 casper.js (http://casperjs.org/) or nightmare (https://github.com/segmentio/nightmare)

但是我相信 nightwatch 中的模拟 http 调用应该可以用 nock 来实现(如果你有一些奇怪的用例可以保证它) 确保你在测试之前调用 http 调用(它们甚至可以在 before 块中),例如:

module.exports = {
  'test abc' : function (browser) {
    nock('http://example.com')
      .get('/users')
      .query({name: 'martin'})
      .reply(200, {results: [{id: '123'}]});

    // do test stuff
  },
};

您的示例可能存在的问题是您模拟整个 UI - nightwatch 可能会以某种方式阻止同一域被拦截。将 UI 和 API 放在不同的域(或端口)上可能会解决问题