Skip to content

How to mock ndjsonStream or ReadableStream in a jest test case #42

@kanteankit

Description

@kanteankit

Hi guys,
Thank you for this awesome library.
I was wondering how I can write a test case that involves ndjsonStream.
Taking the example from the docs and modifying it a bit:

import ndjsonStream from "can-ndjson-stream";
var users = []
var getUsers = ()=>{ return fetch("/users") }

var fetchUsersList = ()=>{
          getUsers()
            .then( ( response ) => {
               return ndjsonStream( response.body ); //ndjsonStream parses the response.body

            } ).then( ( exampleStream ) => {
                const reader = exampleStream.getReader();
                let read;
                reader.read().then( read = ( result ) => {
                if ( result.done ) {
                  return;
                }

               users.push(result.value)  // Each json gets pushed to items array
               reader.read().then( read );
           } );
       } );
}

The code above calls getUsers that returns a Promise object. This Promise is then handled by ndjsonStream. Each JSON read by ndjsonStream is then pushed to the users array.
Now, I want to write a test case using jest that creates a mock function for getUsers and then checks whether the users list gets populated or not. Something like this:

let fakeUsersList = '{"id":"abcd","title":"Random User 1"}\n{"id":"pqrs","title":"Random User 2"}'
import 'isomorphic-fetch'
getUsers = jest.fn(()=>{

     return new Promise((resolve, reject)=>{
          resolve(new Response(fakeUsersList, {
                            status: 200,
                            statusText: 'OK,
                           headers: {
                               'Content-type': 'application/x-ndjson'
                            }
                        })
                   )
           })
})

it('should populate the user list',()=>{
    fetchUsersList()
   expect(users.length).toBe(2)
})

The above code basically says, when fetchUsersList is called, instead of calling the actual getUsers, call the dummy function that responds back with a Promise object. The fake Promise object resolves with a fakeUsersList. Then we test whether the users list has been populated or not

The problem I am facing is this:
I was able to create a dummy response for my API call using a Promise object and using isomorphic-fetch to create Response object.
But, I have no way to create a dummy ReadableStream object. When I run my test case, I get the error ReadableStream is not defined, when this line gets executed
ndjsonStream( response.body)

Is there a way to create a mock/dummy of either the ndjsonStream function itself or the ReadableStream object?
Thanks in advance for any help/suggestions that you guys could provide

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions