Tips for simulating a constant that is initialized externally from a function?

Is there a way to mock a constant used in a function for unit testing without updating the test result every time the constant is updated? I'm hoping to avoid creating a new function that returns the constant.

utils.js

const data = [1, 2, 3]

const functionToTest = () => {
    if (data.includes(2)) {
        return true
    }

    return false
}

test.js

describe('testing functionToTest', () => {
    const dataReplacement = [3, 4, 5]

    tellFunctionToTest('hey, use dataReplacement instead of data')
})

If possible, I'd like to avoid passing data as a parameter. Thanks for any assistance!

Answer №1

To effectively test a function, one method is to export the necessary data and utilize it within the function being tested:

example.js

exports.data = [1, 2, 3];

exports.functionToTest = () => exports.data.includes(2);

test.js

const assert = require('assert');
const example = require('./example');

describe('functionToTest', () => {
  it('should perform as expected', () => {
    example.data = [3, 4, 5];
    assert(example.functionToTest() === false);  // Test passed successfully!
  });
});

Answer №2

To mimic it, simply assign the value to a variable called global:

test('testing functionToTest', () => {
    global.data = [3, 4, 5];
   // carry on with the test
})

Update

I've put together a basic example demonstrating how you can define globals: https://codesandbox.io/s/9q1x757my?fontsize=14

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Introduce new material at the start of each line, akin to what ::before accomplishes for the initial line

I am currently working on customizing the appearance of my <code>/<pre> tags while ensuring that users can still easily highlight and copy the code. The method I had in mind (shown below) only applies to the first line and doesn't repeat ...

The AjaxPoller object is not defined and causing a TypeError

I have a piece of JavaScript code that handles AJAX requests and updates the DOM: this.AjaxHandler = { sendRequest: sendRequest, fetchDataForElement: fetchDataForElement, handleJsonResponse: handleJsonResponse, checkProgress: checkProgress }; fun ...

Using Vuetify to iterate through a list with v-for and dynamically changing the

Currently, I am working on a footer that contains buttons with icons. I am iterating through the icons to change both the icon itself and its color. However, I have encountered an issue. <v-btn v-for="icon in icons" :key=&q ...

Encountering an Angular 5 (IE11) Error: Unhandled Promise Rejection - Route Matching Error

I've been encountering issues with IE11 in Angular 5 for a few days now. I've enabled polyfills: import 'core-js/es6/symbol'; import 'core-js/es6/object'; import 'core-js/es7/object'; import 'core-js/es6/functio ...

JavaScript Summation Calculation

I am currently working on calculating the sum of three scores and displaying the total as "Total:". However, I am facing an issue in dynamically updating the total whenever a score value changes. Is there a way to utilize the "onchange" event to achieve th ...

Installing a node.js application on elastic beanstalk with express framework

I've been struggling with deploying my application to Elastic Beanstalk throughout the entire day. The project structure I have is as follows (a single page app built with React) dist/ index.html bundle.js package.json app.js I compress it into ...

When the button is clicked, avoid the onclick event and display a modal. If "yes" is clicked, execute the onclick function

I am facing an issue with a page containing multiple input elements that all have similar structure. I want to show a modal before executing the onclick event, and only run the function when the "yes" button in the modal is clicked. However, the problem is ...

What causes the disparity in functionality between simple html and css in an Angular 2 project compared to a vanilla html website?

When incorporating the following html/css into a new Angular project created with Angular CLI using 'ng new ProjectName', I encountered issues. Despite adding the CSS to app.component.css or styles.css and the HTML to app.component.html, the Angu ...

invoking a SOAP endpoint with Node.js

I've recently delved into the world of Node.js and I'm attempting to integrate a SOAP service using the node soap extension. Right now, I'm just experimenting with a sample service call but I'm encountering some issues getting it to wor ...

The setInterval function continues to execute endlessly even after each interval is three months

I need to remove all expired OTP records every three months. In the file /sheduled-tasks/OTPRecords.js const prisma = require("../services/prisma"); const THREE_MONTHS = 1000 * 60 * 60 * 24 * 90; async function deleteExpiredOTPRecords() { ...

Creating a specialized validator for an object within express-validation

Concern The custom validator is not providing any response. I need to validate the specified object using express-validator. The 'privilege' key must be valid and present in my array. Although the existence of the privilege object is optional, i ...

In the realm of Node.js, a transform stream simply relays data in its original

I am currently working on a Node.js application that is designed to parse Markdown text and convert it into HTML. My approach involves using a transform stream that processes the input character by character, determines its meaning, and then outputs the co ...

The array containing numbers or undefined values cannot be assigned to an array containing only numbers

Currently facing an issue with TypeScript and types. I have an array of IDs obtained from checkboxes, which may also be empty. An example of values returned from the submit() function: const responseFromSubmit = { 1: { id: "1", value: "true" }, 2: ...

The Three.js environment experiences lag and a decrease in performance

In the threejs scene, there is a sphere geometry and a plane geometry. The sphere is textured with an image, while the plane geometry is textured with 2D text. The plane geometry is also attached with a click event. When clicking on the plane geometry, ...

Creating a translucent casing

Imagine I'm visualizing Wonder Woman maneuvering her Invisible Jet. The jet consists of various meshes and is predominantly transparent. When the transparent meshes overlap, they become less see-through. I aim to eliminate this overlap so that the tra ...

Obtain decrypted information from the token

I am facing difficulty in retrieving decrypted user data for the current user. Every time a user logs in, they receive a token. After logging in, I can take a photo and send it to the server. Looking at my code, you can see that this request requires a to ...

JavaScript autostop timer feature

An innovative concept is the solo cookie timer that holds off for one hour before resuming its function upon user interaction. No luck with Google. https://jsfiddle.net/m6vqyeu8/ Your input or assistance in creating your own version is greatly appreciate ...

The AngularJS beginner routing application is malfunctioning and needs fixing

I've been diving into Angular JS but hit a roadblock with a basic angular routing program. I need some guidance on what's going wrong. If you want to check out the complete project code, visit my GitHub repository: https://github.com/ashpratap00 ...

Testing Ajax code encounters error

Currently, I am running a code test with Jasmine and setting up a mock object for the ajax method. spyOn($,'ajax').and.callFake(function(e){ console.log("is hitting"); }) In order to test the code snippet below: $.ajax({ url: Ap ...

Adding JSON data to an HTML document

Seeking guidance on how to efficiently parse and display information from a JSON file consisting of 3 objects onto a widget. Unsure of the best approach to achieve this task. Any suggestions or methods would be greatly appreciated. Widget Structure: < ...