如何测试cyclejs http驱动程序?

时间:2017-03-27 06:21:28

标签: http testing cyclejs

假设我有一个返回用户详细信息的API: /api/get_user/1

{
  "status": 200,
  "data": {
    "username": "username1",
    "email": "username@email.com"
  }
}

"主要功能"像这样:

function main (sources) {
  const request$ = sources.ACTIONS
    .filter(action => action.type === 'GET_USER_REQUEST')
    .map(action => action.payload)
    .map(payload => ({
      category: 'GET_USER_REQUEST',
      url: `${BASE_URL}/api/get_user/${payload.userId}`,
      method: 'GET'
    }))

  const action$ = sources.HTTP
    .select('GET_USER_REQUEST')
    .flatten()
    .map(response => response.data)

  const sinks = {
    HTTP: request$,
    LOG: action$
  }
  return sinks
}

用于测试" ACTION"来源,我可以简单地制作一个xstream可观察的

test.cb('Test main function', t => {

  const actionStream$ = xs.of({
    type: 'GET_USER_REQUEST',
    payload: { userId: 1 }
  })
  const sources = { ACTION: actionStream$ }
  const expectedResult = {
    category: 'GET_USER_REQUEST',
    url: `${BASE_URL}/api/get_user/${payload.userId}`,
    method: 'GET'
  }

  main(sources).HTTP.addEventListener({
    next: (data) => {
      t.deepEqual(data, expectedResult)
    },
    error: (error) => {
      t.fail(error)
    },
    complete: () => {
      t.end()
    }
  })

})

问题是。是否可以做同样的事情(使用plan xstream observable) 没有像nock这样的帮助器来测试cycle-http驱动程序? 或者有更好的方法来测试这样的东西吗?

1 个答案:

答案 0 :(得分:1)

您可以像这样模拟HTTP源:

test.cb('Test main function', t => {
  const actionStream$ = xs.of({
    type: 'GET_USER_REQUEST',
    payload: { userId: 1 }
  })

  const response$ = xs.of({
    data: {
      status: 200,
      data: {
        username: "username1",
        email: "username@email.com"
      }
    }
  });

  const HTTP = {
    select (category) {
      // if you have multiple categories you could return different streams depending on the category
      return xs.of(response$);
    }
  }

  const sources = { ACTION: actionStream$, HTTP }

  const expectedResult = {
    category: 'GET_USER_REQUEST',
    url: `${BASE_URL}/api/get_user/${payload.userId}`,
    method: 'GET'
  }

  main(sources).HTTP.addEventListener({
    next: (data) => {
      t.deepEqual(data, expectedResult)
    },
    error: (error) => {
      t.fail(error)
    },
    complete: () => {
      t.end()
    }
  })

})

真的,我们应该有一个mockHTTPSource帮助器,以使这更容易一些。我已经解决了这个问题。 https://github.com/cyclejs/cyclejs/issues/567

如果您想测试某些事情是否在正确的时间发生,您可以将此模式与@ cycle / time结合使用。

http://github.com/cyclejs/time