6

我尝试使用 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()
  }
}

夜班可能的模拟 http 请求?

4

1 回答 1

9

Nightwatch.js是一个端到端的测试工具——所以关键是实际的 UI 以及它们调用的 api 将是实时的(而不是模拟的)所以也许你正在寻找一个为集成测试设计的框架,比如casper.jshttp://casperjs. org/ ) 或nightmare( https://github.com/segmentio/nightmare )

但是,我相信模拟 http 调用nightwatch应该是可行的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 放在不同的域(或端口)上可能会解决问题

于 2017-08-03T13:49:34.577 回答