Is there a way to combine stubbing and spying simultaneously?

Currently, I am testing a function that involves calling another function which returns a promise. The System Under Test (SUT) is structured as follows:

fn($modal) -> 
    modalInstance = $modal.open({
       controller: 'myCtrl'
       size: 'lg'
     })

    modalInstance.result.then(updateData)

For testing purposes, one approach could be to begin with the following setup:

it 'when modal called, results get updated with right data', ->

   $modal = {
      open: sinon.stub().returns({ 
          result: $q.when([1, 2, 3]) 
      })
   }

   fn($modal)

Subsequently, we can verify if the updatedData matches [1, 2, 3].

However, it would also be beneficial to confirm whether $modal.open has been invoked and if the appropriate parameters were provided. How can this be achieved?

In addition to stubbing the method, there is a need to spy on it. Should the entire $modal object be mocked? Assistance is required regarding the correct syntax for this.

An attempt was made using the following code snippet:

mMk  = sinon.mock($modal)
mMk.expects('open')

Nevertheless, Sinon raises an error message:

TypeError: Attempted to wrap open which is already stubbed

Answer №1

To use Stubs in Sinon, you have access to the full spy API. An example of this usage is shown below:

// Overriding $modal
$modal = {
    open: sinon.stub().returns({
        result: $q.when([1, 2, 3])
    });
};

fn($modal);
expect($modal.open).toHaveBeenCalledWith(...);

It's worth noting that if $modal is an injectable service, it may be neater to simply stub the open method instead of overriding the entire $modal.

// Override $modal.open
sinon.stub($modal, 'open').returns({
    result: $q.when([1, 2, 3])
});

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

Retrieving AJAX Response and Assigning it to a JavaScript Variable

I've dedicated countless hours searching for assistance on how to implement an AJAX call in Javascript to communicate with a PHP script. My goal is to add a value to a table, retrieve the ID of the newly inserted row, and use that ID in a form submis ...

Can you explain the inner workings of the sort function mechanism?

After reading through this article about Array.prototype.sort(), I noticed that the Sort() function can behave differently depending on the availability of compareFunction. When it comes to sorting strings, it uses UNICODE values. However, in a specific ...

What causes Chrome Extension Images to appear broken when they are inserted into the DOM?

Currently working on a Chrome extension, I am attempting to insert a div with a background image into the DOM using a content script. The CSS is loading correctly, and upon inspecting the Developer Tools, the image URL appears to be correct. $('.clos ...

Experiencing difficulties with certain npm CLI modules when using it as a task runner and build tool

After coming across an article about using npm as a build tool, I decided to give it a try for my tasks. However, I am facing an issue that has me stuck. Whenever I run a global command-line tool like JSLINT, JSHINT, or ESLINT using npm, the console always ...

Utilizing a template to refine a JSON object

Looking to mask JSON objects' properties and values based on a dynamic template for security purposes. It's akin to seeing the JSON objects through a veil that is revealed only at runtime. Let's consider this JSON object: { "id": "1", "f ...

A guide on linking an object in strapi V4 to a React app

Recently in strapi v4, there was a change in the response API structure from an array to an object. When analyzing the response using Postman on my local strapi API and converting it into raw format with stringify, I noticed that the API response consists ...

Exploring the location of unit testing within async-await in Angular applications

I have been working with Angular 9+ along with karma test runner and jasmine test framework for my unit tests. My focus is on unit testing only the app component which includes dependency injection: app.component.ts import { Component, EmbeddedViewRef } ...

"Angular-chart is throwing an error with an undefined $scope.chart

I am having trouble creating a chart with an onClick event that can retrieve the label that was clicked. After searching, I found and modified a solution. Here is my code snippet: $scope.chart; $scope.onClick = function (points, evt) { console.log(po ...

Having trouble with a 'Could not find a declaration file for module' error while using my JavaScript npm package?

I recently released a JavaScript npm package that is functioning properly. However, when importing it into another application, there always seems to be three dots in front of the name, along with an error message that reads: Could not find a declaration f ...

The functionality of a basic each/while loop in jQuery using CoffeeScript is not producing the desired results

I've been experimenting with different methods to tackle this issue. Essentially, I need to update the content of multiple dropdowns in the same way. I wanted to use an each or a while loop to keep the code DRY, but my experience in coffeeScript is li ...

"How can I perform a expressjs database query based on a specific user's

app.get('/user/:id', function(req, res){ fetchData(req.params.id, res); }); function fetchData(id, res) { connection.query('SELECT * FROM data WHERE name = ?' , function(err, rows){ res.render('users', {users ...

The audio directory is not included in the build of the Ionic framework, causing it to be skipped and absent

Recently, I've been working on an Ionic/Cordova app and came across a folder labeled /audio which consists of mp3 files: /www /assets /audio file.mp3 /css /js config.xml index.html The issue at hand is that the /audio directory is n ...

Glitched Water Reflection in THREE.js

Creating a water scene using JavaScript. I followed the official examples to set up the scene, but the reflection seems off after loading an external GLTF model. Initially everything looks fine, but once I start moving the camera, things go awry. I suspe ...

What is the best way to identify onKeyUp events in AngularJS?

Is there a way to detect when a user releases a key in AngularJS? I have been searching for an 'ngOnkeyup' directive, similar to ngChange, without any luck. If this specific directive doesn't exist, is there a simple method to trigger a co ...

JavaScript Switch Open/Close Mobile Navigation Menu

I'm currently facing a challenge with a specific issue. I want to implement a toggle menu for mobile devices on a website that I'm developing. It's functioning smoothly, and you can see it in action on this CodePen. The JavaScript code for ...

The dynamic duo of web development: React and Bootstrap JavaScript

As I work with ReactJS, I have come to understand that using JQuery or vanilla JS to directly manipulate the DOM is not recommended. This is because ReactJS operates using a virtual DOM, which can lead to unpredictable outcomes. My question now is: if I w ...

Using jQuery to iterate through JSON data obtained from a web service

In this code snippet, I am attempting to retrieve a JSON response from a PHP page and then iterate through it to display the name field of each JSON object. However, for some reason, nothing is being alerted out. <html> <head> <title>A ...

Tips for sending an API request from a local Ionic server to a separate local Express server

I currently have two applications running on my local machine: an ionic2 app running on http://localhost:8041 and an express app running on http://localhost:8000. Using Angular 2 observables, I am encountering an issue when making API calls with absolute p ...

Create a global base URL variable within the Axios plugin for Vue

As I work on my Vue.js project, I've successfully implemented a plugin for Axios following the guidelines provided here. This allows Axios to be utilized globally within the project. The key snippets of code in my project are as follows: in src/plugi ...

Stop the ThreeJS rendering process

Currently, I am using ThreeJS to create a basic 3D scene with OrbitControls. The problem I'm facing is that it causes my entire website to lag, even when the user is not actively looking at the scene. I am in need of a function that can start and stop ...