如何在传奇中模拟http请求(黑盒测试方法)

时间:2018-02-09 07:13:02

标签: javascript reactjs unit-testing redux saga

我正试图采用黑盒方法并使用sagaTester来测试我的传奇。

这是来自react-boilerplate的saga.js:

export function* getRepos() {
  // Select username from store
  const username = yield select(makeSelectUsername());
  const requestURL = `https://api.github.com/users/${username}/repos?type=all&sort=updated`;

  try {
    // Call our request helper (see 'utils/request')
    const repos = yield call(request, requestURL);
    yield put(reposLoaded(repos, username));
  } catch (err) {
    yield put(repoLoadingError(err));
  }
}

export default function* githubData() {
  // Watches for LOAD_REPOS actions and calls getRepos when one comes in.
  // By using `takeLatest` only the result of the latest API call is applied.
  // It returns task descriptor (just like fork) so we can continue execution
  // It will be cancelled automatically on component unmount
  yield takeLatest(LOAD_REPOS, getRepos);
}

这是我的saga.test.js:

it('black box testing using sagaTester', async () => {
    const initialState = fromJS({
      home: {
        username: 'john',
      },
    });
    const sagaTester = new SagaTester({ initialState });
    sagaTester.start(githubData);

    sagaTester.dispatch(loadRepos());

    nock('https://api.github.com/repos?type=all&sort=updated')
      .get('/users/john')
      .reply(200, 'hello world');

    await sagaTester.waitFor(reposLoaded.type);
  });

这是我遇到的错误:

  

错误:超时 - 超时内未调用异步回调   由jasmine.DEFAULT_TIMEOUT_INTERVAL指定。

我要做的就是模仿这一行的回应:

const repos = yield call(request, requestURL);

我做错了什么????

任何帮助表示赞赏!!!

2 个答案:

答案 0 :(得分:0)

您的代码主要有两个问题:

  • 缺少CORS标题
  • 错误waitFor致电

工作示例:

nock('https://api.github.com')
  .get('/users/john/repos')
  .query({ type: "all", sort: "updated" })
  .reply(200, [{ name: 'First repo', }, { name: 'Second repo', }], {'Access-Control-Allow-Origin': '*'});


await sagaTester.waitFor(reposLoaded().type);

答案 1 :(得分:0)

我希望这会帮助那些偶然发现这个问题的人。 这里的问题是whatwg-fetch,它是react-boiler-plate中库中的烘焙。

我查看了示例here,我注意到正在使用node-fetch。

所以我更换了这一行:

const repos = yield call(request, requestURL);

使用:

const repos = yield call(() => fetch(requestURL));

我的测试工作正常。

另一件事,如果你想使用axios而不是whatwg,那么你最好使用axios-mock-adapter来模拟请求。经过几个小时的摆弄,终于得到了这个工作。谢谢你的帮助!