Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* feat: add guide on mock request * feat: add more comment
- Loading branch information
1 parent
0c45287
commit 6990d29
Showing
2 changed files
with
102 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
# Mocking Request | ||
|
||
Undici have its own mocking [utility](docs/api/MockAgent.md). It allow us to intercept undici HTTP request and return mocked value instead. It can be useful for testing purposes. | ||
|
||
Example: | ||
|
||
```js | ||
// index.mjs | ||
import { request } from 'undici' | ||
|
||
export async function bankTransfer(recepient, ammount) { | ||
const { body } = await request('http://localhost:3000/bank-transfer', | ||
{ | ||
method: 'POST', | ||
headers: { | ||
'X-TOKEN-SECRET': 'SuperSecretToken', | ||
}, | ||
body: JSON.stringify({ recepient }) | ||
} | ||
) | ||
return await body.json() | ||
} | ||
``` | ||
|
||
And this is what the test file looks like: | ||
|
||
```js | ||
// index.test.mjs | ||
import { strict as assert } from 'assert' | ||
import { MockAgent, setGlobalDispatcher, } from 'undici' | ||
import { bankTransfer } from './undici.mjs' | ||
|
||
const mockAgent = new MockAgent(); | ||
|
||
setGlobalDispatcher(mockAgent); | ||
|
||
// Provide the base url to the request | ||
const mockPool = mockAgent.get('http://localhost:3000'); | ||
|
||
// intercept the request | ||
mockPool.intercept({ | ||
path: '/bank-transfer', | ||
method: 'POST', | ||
headers: { | ||
'X-TOKEN-SECRET': 'SuperSecretToken', | ||
}, | ||
body: JSON.stringify({ | ||
recepient: '1234567890', | ||
ammount: '100' | ||
}) | ||
}).reply(200, { | ||
message: 'transaction processed' | ||
}) | ||
|
||
const success = await bankTransfer('1234567890', '100') | ||
|
||
assert.deepEqual(success, { message: 'transaction processed' }) | ||
|
||
// if you dont want to check whether the body or the headers contain the same value | ||
// just remove it from interceptor | ||
mockPool.intercept({ | ||
path: '/bank-transfer', | ||
method: 'POST', | ||
}).reply(400, { | ||
message: 'bank account not found' | ||
}) | ||
|
||
const badRequest = await bankTransfer('1234567890', '100') | ||
|
||
assert.deepEqual(badRequest, { message: 'bank account not found' }) | ||
``` | ||
|
||
Explore other MockAgent functionality [here](docs/api/MockAgent.md) | ||
|
||
## Debug Mock Value | ||
|
||
When the interceptor we wrote are not the same undici will automatically call real HTTP request. To debug our mock value use `mockAgent.disableNetConnect()` | ||
|
||
```js | ||
const mockAgent = new MockAgent(); | ||
|
||
setGlobalDispatcher(mockAgent); | ||
mockAgent.disableNetConnect() | ||
|
||
// Provide the base url to the request | ||
const mockPool = mockAgent.get('http://localhost:3000'); | ||
|
||
mockPool.intercept({ | ||
path: '/bank-tanfer', | ||
method: 'POST', | ||
}).reply(200, { | ||
message: 'transaction processed' | ||
}) | ||
|
||
const badRequest = await bankTransfer('1234567890', '100') | ||
// Will throw an error | ||
// MockNotMatchedError: Mock dispatch not matched for path '/bank-transfer': | ||
// subsequent request to origin http://localhost:3000 was not allowed (net.connect disabled) | ||
``` | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters