{"id":5597,"date":"2023-04-17T08:02:00","date_gmt":"2023-04-17T08:02:00","guid":{"rendered":"https:\/\/prometteursolutions.com\/blog\/?p=5597"},"modified":"2025-10-29T09:52:42","modified_gmt":"2025-10-29T09:52:42","slug":"angularjs-testing-tutorial-cypress-karma-and-protractor","status":"publish","type":"post","link":"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/","title":{"rendered":"AngularJS Testing Tutorial for Beginners"},"content":{"rendered":"\r\n<p class=\"ds-markdown-paragraph\">Welcome to this hands-on AngularJS testing tutorial for beginners!<\/p>\r\n<p class=\"ds-markdown-paragraph\">Testing is crucial for building robust AngularJS applications, yet many developers find it challenging. This tutorial aims to make testing Angular code straightforward through easy-to-follow examples.<\/p>\r\n<p class=\"ds-markdown-paragraph\">Following core testing principles around isolation and mocking, you will gain practical experience creating maintainable tests that catch issues rapidly.\u00a0By the end,\u00a0you will have the essential skills to build production-grade AngularJS applications that meet functionality, compatibility, reliability and performance requirements.<\/p>\r\n<p class=\"ds-markdown-paragraph\">With a focus on simplicity and real-world applicability,\u00a0AngularJS Testing Tutorial\u00a0will give you the testing confidence to create bug-free AngularJS apps.<\/p>\r\n<p class=\"ds-markdown-paragraph\">So let&#8217;s get started!<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\"><strong>Common AngularJS Testing Tools<\/strong><\/h2>\r\n<p class=\"ds-markdown-paragraph\">\u00b7 Cypress &#8211; End-to-end testing framework that runs directly in modern browsers<br \/>\u00b7 Karma &#8211; Test runner for unit testing AngularJS code<br \/>\u00b7 Protractor &#8211; End-to-end test framework for AngularJS applications<\/p>\r\n<h2><strong>AngularJS Applications &#8211; Key Components<\/strong><\/h2>\r\n<p class=\"ds-markdown-paragraph\">When building AngularJS applications, developers work with several key components that make up the structure and functionality of the app. These components work together to create the logic, views, and underlying services that power the user experience.<\/p>\r\n<h3 class=\"ds-markdown-paragraph\"><strong>1. Controllers:<\/strong>\u00a0<\/h3>\r\n<p class=\"ds-markdown-paragraph\">These are JavaScript functions that provide the business logic behind views. In the MVC design pattern, controllers act as the controllers, handling user input, manipulating data, and deciding what content to render.\u00a0<strong>In practice,<\/strong>\u00a0developers create controllers to connect AngularJS scopes to views.<\/p>\r\n<h3 class=\"ds-markdown-paragraph\"><strong>2. Views:<\/strong>\u00a0<\/h3>\r\n<p class=\"ds-markdown-paragraph\">Defined using HTML, views render data from controllers and models.\u00a0<strong>A key feature<\/strong>\u00a0is their use of data binding to automatically update when model data changes, which eliminates the need for manual updates.<\/p>\r\n<h3 class=\"ds-markdown-paragraph\"><strong>3. Models:<\/strong>\u00a0<\/h3>\r\n<p class=\"ds-markdown-paragraph\">These can be simple JavaScript objects or be derived from a persistence framework like Firebase.\u00a0<strong>Their purpose<\/strong>\u00a0is to represent the application&#8217;s data concepts in a structure suitable for views.<\/p>\r\n<h3 class=\"ds-markdown-paragraph\"><strong>4. Services:<\/strong>\u00a0<\/h3>\r\n<p class=\"ds-markdown-paragraph\">AngularJS services perform tasks like making API calls without cluttering controller code.\u00a0<strong>Furthermore,<\/strong>\u00a0services can be shared across the application, which increases flexibility and reuse.<\/p>\r\n<h3 class=\"ds-markdown-paragraph\"><strong>5. Modules:<\/strong>\u00a0<\/h3>\r\n<p class=\"ds-markdown-paragraph\">Developers define modules using\u00a0<code>ng-app<\/code>\u00a0to declare application dependencies and the entry component.\u00a0<strong>This approach<\/strong>\u00a0boosts organization and maintains a separation of concerns.<\/p>\r\n<p class=\"ds-markdown-paragraph\">By leveraging these key components,\u00a0developers can build robust AngularJS web apps with a clean separation of concerns between the different layers.\u00a0Ultimately,\u00a0the flexibility of AngularJS components allows for crafting complex, data-driven user experiences.<\/p>\r\n<h2><strong>Unit Testing in AngularJS<\/strong><\/h2>\r\n\r\n\r\n\r\n<p class=\"ds-markdown-paragraph\">AngularJS unit testing is essential for building high-quality applications because it validates that individual components like controllers, directives, and services function as expected.<\/p>\r\n<p class=\"ds-markdown-paragraph\"><strong>The key benefits include:<\/strong>\u00a0catching bugs early, enabling safe refactoring of code, and simplifying the integration of code from different developers.\u00a0<strong>Therefore,<\/strong>\u00a0before an AngularJS application can be considered production-ready, it should undergo thorough unit testing to detect issues at the earliest possible stage.<\/p>\r\n<p class=\"ds-markdown-paragraph\"><strong>As a result,<\/strong>\u00a0robust unit testing leads to applications that are more reliable, better optimized, and more aligned with business requirements. It also enables diagnosing and fixing bugs rapidly, giving users greater confidence in the application&#8217;s capabilities.<\/p>\r\n<h3><strong>Fundamentals of Unit Testing in AngularJS<\/strong><\/h3>\r\n<p class=\"ds-markdown-paragraph\">When writing unit tests for your AngularJS code, following core fundamentals will ensure your test suite is robust, maintainable, and sustainable as your app evolves:<\/p>\r\n<ul>\r\n<li class=\"ds-markdown-paragraph\"><strong>Isolate Dependencies:<\/strong>\u00a0Each unit test should test one specific component in isolation without relying on other modules or external dependencies. Use mocks, spies, and stubs to simulate dependencies.<\/li>\r\n<li class=\"ds-markdown-paragraph\"><strong>Arrange, Act, Assert (AAA):<\/strong>\u00a0Structure your test into three clearly defined sections: arrange test data\/inputs, execute the logic to test (act), and assert the expected output was produced.<\/li>\r\n<li class=\"ds-markdown-paragraph\"><strong>One Assertion Per Test:<\/strong>\u00a0Every test case should validate one behavior or output to make it easy to identify what failed. Avoid assertions that check multiple outputs.<\/li>\r\n<li class=\"ds-markdown-paragraph\"><strong>Make Tests Independent:<\/strong>\u00a0Write test cases to set up their own test data so they can run independently and not rely on the order of execution. This is especially helpful when running tests in parallel.<\/li>\r\n<li class=\"ds-markdown-paragraph\"><strong>Keep Tests Short and Readable:<\/strong>\u00a0Break down lengthy test cases into smaller helper functions that each test a single behavior or subunit of a component.<\/li>\r\n<\/ul>\r\n<p class=\"ds-markdown-paragraph\"><strong>Following these fundamental guidelines<\/strong>\u00a0will ensure your AngularJS unit test suite remains robust and easy to extend over time as application complexity grows.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Setting Up Your Environment<\/h2>\r\n\r\n\r\n\r\n<p class=\"ds-markdown-paragraph\">To get started with unit testing, just follow these steps:<\/p>\r\n<h3 class=\"ds-markdown-paragraph\"><strong>1. Install Prerequisites<\/strong><\/h3>\r\n<ul>\r\n<li class=\"ds-markdown-paragraph\">Install Node.js on your computer, as this is the framework we&#8217;ll build on.<\/li>\r\n<li class=\"ds-markdown-paragraph\">Open your favorite code editor (e.g., Visual Studio Code, Brackets, or Sublime Text).<\/li>\r\n<\/ul>\r\n<h3 class=\"ds-markdown-paragraph\"><strong>2. Create Project Structure<\/strong><\/h3>\r\n<ul>\r\n<li class=\"ds-markdown-paragraph\">Create a new folder called &#8220;unit-testing&#8221; on your computer using the\u00a0<code>mkdir<\/code>\u00a0command. This is where you&#8217;ll store your test files.<\/li>\r\n<li class=\"ds-markdown-paragraph\">Open the\u00a0<code>unit-testing<\/code>\u00a0folder in your code editor and open a terminal window inside it.<\/li>\r\n<\/ul>\r\n<h3 class=\"ds-markdown-paragraph\"><strong>3. Initialize Project and Install Dependencies<\/strong><\/h3>\r\n<p class=\"ds-markdown-paragraph\">Create a\u00a0<code>package.json<\/code>\u00a0file and install the necessary packages:<\/p>\r\n<div class=\"md-code-block md-code-block-dark\">\r\n<div class=\"md-code-block-banner-wrap\">\r\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\r\n<div class=\"_121d384\">\r\n<div class=\"d2a24f03\"><span class=\"d813de27\">bash<\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<pre><span class=\"token function\">npm<\/span> init\r\n<span class=\"token function\">npm<\/span> I angular <span class=\"token parameter variable\">--save<\/span>\r\n<span class=\"token function\">npm<\/span> i <span class=\"token parameter variable\">-g<\/span> karma --save-dev\r\n<span class=\"token function\">npm<\/span> I karma-jasmine jasmine-core --save-dev\r\n<span class=\"token function\">npm<\/span> I angular-mocks --save-dev\r\n<span class=\"token function\">npm<\/span> I karma-chrome-launcher --save-dev<\/pre>\r\n<\/div>\r\n<h3 class=\"ds-markdown-paragraph\"><strong>4. Configure Karma<\/strong><\/h3>\r\n<ul>\r\n<li class=\"ds-markdown-paragraph\">In your\u00a0<code>unit-testing<\/code>\u00a0folder, create two new folders called\u00a0<code>app<\/code>\u00a0and\u00a0<code>test<\/code>.<\/li>\r\n<li class=\"ds-markdown-paragraph\">Next, inside the\u00a0<code>unit-testing<\/code>\u00a0folder, create a new file called\u00a0<code>karma.config.js<\/code>.<\/li>\r\n<li class=\"ds-markdown-paragraph\">Open\u00a0<code>karma.config.js<\/code>\u00a0in your code editor and type\u00a0<code>karma init<\/code>. This will initialize an empty repository with some standard settings.<\/li>\r\n<li class=\"ds-markdown-paragraph\">You&#8217;ll be asked a series of questions about how you want to configure Karma. Answer them based on your preferences (the defaults are fine).<\/li>\r\n<\/ul>\r\n<h2><strong>End-to-End Testing in AngularJS with Protractor or Cypress<\/strong><\/h2>\r\n<p class=\"ds-markdown-paragraph\">End-to-end (E2E) testing simulates how a real user would interact with your application from start to finish.\u00a0<strong>While unit tests are limited<\/strong>\u00a0to evaluating single parts of code in isolation, E2E testing is significant for catching issues that emerge when you string those building blocks into full workflows.<\/p>\r\n<p class=\"ds-markdown-paragraph\"><strong>For example,<\/strong>\u00a0unit tests could validate that a login form and database query work as expected.\u00a0<strong>However,<\/strong>\u00a0E2E testing goes further by logging in with real credentials, clicking around, and pulling actual data.<\/p>\r\n<p class=\"ds-markdown-paragraph\"><strong>Consequently,<\/strong>\u00a0E2E testing provides confidence that your application functions smoothly under real-world conditions, finding gaps that fall between unit and integration testing.<\/p>\r\n<h3><strong>Benefits of End-to-End Testing<\/strong><\/h3>\r\n<p class=\"ds-markdown-paragraph\">Doing comprehensive end-to-end testing provides several important benefits:<\/p>\r\n<ul>\r\n<li class=\"ds-markdown-paragraph\">Catches more bugs upfront, leading to higher quality software.<\/li>\r\n<li class=\"ds-markdown-paragraph\">Ensures all components work together smoothly, increasing confidence.<\/li>\r\n<li class=\"ds-markdown-paragraph\">Models real-world user workflows, enhancing user experience.<\/li>\r\n<li class=\"ds-markdown-paragraph\">Saves time and money by fixing issues earlier rather than later.<\/li>\r\n<li class=\"ds-markdown-paragraph\">Promotes collaboration across teams working on different components.<\/li>\r\n<li class=\"ds-markdown-paragraph\">Automates repetitive tests, boosting productivity.<\/li>\r\n<li class=\"ds-markdown-paragraph\">Accelerates time-to-market by reducing defects before release.<\/li>\r\n<\/ul>\r\n<p class=\"ds-markdown-paragraph\"><strong>In short,<\/strong>\u00a0E2E testing delivers more robust, reliable software that meets business and user needs by validating quality from start to finish across the entire application.<\/p>\r\n<h3><strong>1. Setting Up Cypress for E2E Testing<\/strong><\/h3>\r\n<ul>\r\n<li class=\"ds-markdown-paragraph\">\r\n<h4><em><strong>Setting up Cypress is straightforward:<\/strong><\/em><\/h4>\r\n<\/li>\r\n<\/ul>\r\n<ol>\r\n<li class=\"ds-markdown-paragraph\">Create a new project folder and initialize it:\u00a0<code>npm init<\/code><\/li>\r\n<li class=\"ds-markdown-paragraph\">Install Cypress in the project folder:\u00a0<code>npm install cypress --save-dev<\/code>\u00a0(or\u00a0<code>yarn add cypress --dev<\/code>)<\/li>\r\n<\/ol>\r\n<p class=\"ds-markdown-paragraph\"><strong>And that&#8217;s it!<\/strong>\u00a0With Cypress installed, you can now begin creating and running end-to-end tests for your application.<\/p>\r\n<h3><strong>2. Installing Protractor for E2E Testing<\/strong><\/h3>\r\n<p class=\"ds-markdown-paragraph\"><strong>Prerequisite:<\/strong>\u00a0Node.js must be installed.<\/p>\r\n<ol>\r\n<li class=\"ds-markdown-paragraph\">Open a terminal and type:\u00a0<code>npm install -g protractor<\/code><\/li>\r\n<li class=\"ds-markdown-paragraph\">This installs two command line tools:\u00a0<code>protractor<\/code>\u00a0(the test runner) and\u00a0<code>webdriver-manager<\/code>\u00a0(manages the Selenium webdriver).<\/li>\r\n<li class=\"ds-markdown-paragraph\">Verify the installation with:\u00a0<code>protractor --version<\/code><\/li>\r\n<\/ol>\r\n<p class=\"ds-markdown-paragraph\">This will install the latest Protractor version globally, making the test runner and Selenium manager available from the command line.<\/p>\r\n<h3><strong>3. Integration Testing in AngularJS<\/strong><\/h3>\r\n<p class=\"ds-markdown-paragraph\">Integration testing validates that different units or components of an application work correctly when combined together.<\/p>\r\n<p class=\"ds-markdown-paragraph\"><strong>It&#8217;s important to distinguish<\/strong>\u00a0this from other test types:<\/p>\r\n<ul>\r\n<li class=\"ds-markdown-paragraph\"><strong>Unit testing<\/strong>\u00a0focuses on individual units in isolation.<\/li>\r\n<li class=\"ds-markdown-paragraph\"><strong>End-to-End (E2E) testing<\/strong>\u00a0replicates entire user workflows.<\/li>\r\n<li class=\"ds-markdown-paragraph\"><strong>Integration testing<\/strong>, however, confirms that interactions between integrated units are functioning as expected.\u00a0<strong>For instance,<\/strong>\u00a0it can test that the UI layer successfully calls and displays data from an API endpoint.<\/li>\r\n<\/ul>\r\n<p class=\"ds-markdown-paragraph\"><strong>So, while<\/strong>\u00a0unit testing examines individual modules and E2E checks overall flows, integration testing focuses on verifying the connections between integrated components.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><strong>Setting Up an Angular Integration Test<\/strong><\/h3>\r\n<ul>\r\n<li class=\"ds-markdown-paragraph\">\r\n<h4><em><strong>Step 1: Create a New Angular Project<\/strong><\/em><\/h4>\r\n<\/li>\r\n<\/ul>\r\n<p class=\"ds-markdown-paragraph\">To create a new Angular project, type the following command in your terminal:<br \/><code>ng new angular-todo-app<\/code><br \/>Wait for Angular to set up your new project.<\/p>\r\n<ul>\r\n<li class=\"ds-markdown-paragraph\">\r\n<h4><em><strong>Step 2: Leverage Auto-Generated Test Files<\/strong><\/em><\/h4>\r\n<\/li>\r\n<\/ul>\r\n<p class=\"ds-markdown-paragraph\">Angular automatically generates test files (<code>*.spec.ts<\/code>) for TypeScript components. For our integration test, we will leverage the default\u00a0<code>app.component.spec.ts<\/code>\u00a0file that Angular generates in the root\u00a0<code>app<\/code>\u00a0folder. This spec file is connected to the main\u00a0<code>app.component.ts<\/code>\u00a0and is pre-wired for testing.<\/p>\r\n<ul>\r\n<li class=\"ds-markdown-paragraph\">\r\n<h4><em><strong>Step 3: Create and Set up a Test Suite<\/strong><\/em><\/h4>\r\n<\/li>\r\n<\/ul>\r\n<p class=\"ds-markdown-paragraph\">Open\u00a0<code>app.component.specs.ts<\/code>\u00a0and create a new test suite with the following code:<\/p>\r\n<div class=\"md-code-block md-code-block-dark\">\r\n<div class=\"md-code-block-banner-wrap\">\r\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\r\n<div class=\"_121d384\">\r\n<div class=\"d2a24f03\"><span class=\"d813de27\">typescript<\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<pre><span class=\"token function\">describe<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'TodoList Integration'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token keyword\">let<\/span> component<span class=\"token operator\">:<\/span> AppComponent<span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token keyword\">let<\/span> fixture<span class=\"token operator\">:<\/span> ComponentFixture<span class=\"token operator\">&lt;<\/span>AppComponent<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token keyword\">let<\/span> service<span class=\"token operator\">:<\/span> TodoService<span class=\"token punctuation\">;<\/span>\r\n\r\n  <span class=\"token function\">beforeEach<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">async<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">await<\/span> TestBed<span class=\"token punctuation\">.<\/span><span class=\"token function\">configureTestingModule<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span>\r\n      imports<span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span>FormsModule<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\r\n      declarations<span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span>AppComponent<span class=\"token punctuation\">,<\/span> TodoComponent<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\r\n      providers<span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span>\r\n        <span class=\"token punctuation\">{<\/span>\r\n          provide<span class=\"token operator\">:<\/span> TodoService<span class=\"token punctuation\">,<\/span>\r\n          useValue<span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span>\r\n            <span class=\"token function-variable function\">getTasks<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n              <span class=\"token keyword\">return<\/span> dummyTodos<span class=\"token punctuation\">;<\/span>\r\n            <span class=\"token punctuation\">}<\/span>\r\n          <span class=\"token punctuation\">}<\/span>\r\n        <span class=\"token punctuation\">}<\/span>\r\n      <span class=\"token punctuation\">]<\/span>\r\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">compileComponents<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n    fixture <span class=\"token operator\">=<\/span> TestBed<span class=\"token punctuation\">.<\/span><span class=\"token function\">createComponent<\/span><span class=\"token punctuation\">(<\/span>AppComponent<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    component <span class=\"token operator\">=<\/span> fixture<span class=\"token punctuation\">.<\/span>componentInstance<span class=\"token punctuation\">;<\/span>\r\n    service <span class=\"token operator\">=<\/span> TestBed<span class=\"token punctuation\">.<\/span><span class=\"token function\">inject<\/span><span class=\"token punctuation\">(<\/span>TodoService<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">const<\/span> dummyTodos <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span>\r\n  <span class=\"token punctuation\">{<\/span>\r\n    id<span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span>\r\n    title<span class=\"token operator\">:<\/span> <span class=\"token string\">'Todo 1'<\/span><span class=\"token punctuation\">,<\/span>\r\n    completed<span class=\"token operator\">:<\/span> <span class=\"token boolean\">false<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token punctuation\">{<\/span>\r\n    id<span class=\"token operator\">:<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">,<\/span>\r\n    title<span class=\"token operator\">:<\/span> <span class=\"token string\">'Todo 2'<\/span><span class=\"token punctuation\">,<\/span>\r\n    completed<span class=\"token operator\">:<\/span> <span class=\"token boolean\">false<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><\/pre>\r\n<\/div>\r\n<p class=\"ds-markdown-paragraph\"><em>This setup includes an async test configuration, module compilation, and dummy data definition.<\/em><\/p>\r\n<ul>\r\n<li class=\"ds-markdown-paragraph\">\r\n<h4><em><strong>Step 4: Write the Integration Test<\/strong><\/em><\/h4>\r\n<\/li>\r\n<\/ul>\r\n<div class=\"md-code-block md-code-block-dark\">\r\n<div class=\"md-code-block-banner-wrap\">\r\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\r\n<div class=\"_121d384\">\r\n<div class=\"d2a24f03\"><span class=\"d813de27\">typescript<\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<pre><span class=\"token function\">it<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'should load todos from service'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">async<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n  fixture<span class=\"token punctuation\">.<\/span><span class=\"token function\">detectChanges<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token function\">expect<\/span><span class=\"token punctuation\">(<\/span>component<span class=\"token punctuation\">.<\/span>todos<span class=\"token punctuation\">.<\/span>length<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">toBe<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token function\">expect<\/span><span class=\"token punctuation\">(<\/span>service<span class=\"token punctuation\">.<\/span><span class=\"token function\">getTasks<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">toEqual<\/span><span class=\"token punctuation\">(<\/span>dummyTodos<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/pre>\r\n<\/div>\r\n<p class=\"ds-markdown-paragraph\"><em>This test triggers data binding and asserts that the component&#8217;s data matches the service data.<\/em><\/p>\r\n<ul>\r\n<li class=\"ds-markdown-paragraph\">\r\n<h4><em><strong>Step 5: Run the Test<\/strong><\/em><\/h4>\r\n<\/li>\r\n<\/ul>\r\n<p class=\"ds-markdown-paragraph\">To execute the integration tests, navigate to the project root in a terminal and run:<\/p>\r\n<div class=\"md-code-block md-code-block-dark\">\r\n<div class=\"md-code-block-banner-wrap\">\r\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\r\n<div class=\"_121d384\">\r\n<div class=\"d2a24f03\"><span class=\"d813de27\">bash<\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<pre>ng <span class=\"token builtin class-name\">test<\/span><\/pre>\r\n<\/div>\r\n<p class=\"ds-markdown-paragraph\">Or to run a specific file:<\/p>\r\n<div class=\"md-code-block md-code-block-dark\">\r\n<div class=\"md-code-block-banner-wrap\">\r\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\r\n<div class=\"_121d384\">\r\n<div class=\"d2a24f03\"><span class=\"d813de27\">bash<\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<pre>ng <span class=\"token builtin class-name\">test<\/span> <span class=\"token parameter variable\">--include<\/span> app.component.spec.ts<\/pre>\r\n<\/div>\r\n<p class=\"ds-markdown-paragraph\">Angular will set up the test environment and report the results.<\/p>\r\n<h2><strong>Testing Services in AngularJS<\/strong><\/h2>\r\n<p class=\"ds-markdown-paragraph\">Services are one of the most important building blocks in AngularJS applications, providing reusable business logic.\u00a0<strong>But how do you make sure<\/strong>\u00a0your services have robust test coverage?<\/p>\r\n<p class=\"ds-markdown-paragraph\"><strong>This section offers best practices<\/strong>\u00a0for unit testing your services so you can:<\/p>\r\n<ul>\r\n<li class=\"ds-markdown-paragraph\">Set up the AngularJS testing framework from scratch.<\/li>\r\n<li class=\"ds-markdown-paragraph\">Effectively mock dependencies your services interact with.<\/li>\r\n<li class=\"ds-markdown-paragraph\">Validate service behavior through well-structured test specs.<\/li>\r\n<li class=\"ds-markdown-paragraph\">Identify relevant use cases to maximize coverage.<\/li>\r\n<\/ul>\r\n<p class=\"ds-markdown-paragraph\">Testing services well uncovers flaws early and gives confidence that business rules enforce data integrity.<\/p>\r\n<h2><strong>Testing Controllers in AngularJS<\/strong><\/h2>\r\n<p class=\"ds-markdown-paragraph\">Controllers are the backbone of dynamic behavior in AngularJS applications, connecting the user interface to underlying logic.\u00a0<strong>Therefore,<\/strong>\u00a0testing controllers thoroughly prevents interface mishaps down the road.<\/p>\r\n<p class=\"ds-markdown-paragraph\">A reliable test suite allows you to simulate user interactions and validate that controllers transform and present data correctly.<\/p>\r\n<h3><strong>Injecting Services into AngularJS Controllers<\/strong><\/h3>\r\n<p class=\"ds-markdown-paragraph\">When unit testing controllers, you&#8217;ll need to mock out its dependencies.\u00a0<strong>There are two standard ways<\/strong>\u00a0to inject these dependencies:<\/p>\r\n<h3 class=\"ds-markdown-paragraph\"><strong>1. Inline Array<\/strong><\/h3>\r\n<p class=\"ds-markdown-paragraph\">Define an inline array listing the dependencies &#8211; handy for simple cases:<\/p>\r\n<div class=\"md-code-block md-code-block-dark\">\r\n<div class=\"md-code-block-banner-wrap\">\r\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\r\n<div class=\"_121d384\">\r\n<div class=\"d2a24f03\"><span class=\"d813de27\">javascript<\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<pre>angular<span class=\"token punctuation\">.<\/span><span class=\"token function\">module<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'myApp'<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">.<\/span><span class=\"token function\">controller<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'MyController'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">'$scope'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">'MyService'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">function<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">$scope<span class=\"token punctuation\">,<\/span> MyService<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token comment\">\/\/ ...<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/pre>\r\n<\/div>\r\n<h3 class=\"ds-markdown-paragraph\"><strong>2.\u00a0<code>$inject<\/code>\u00a0Property<\/strong><\/h3>\r\n<p class=\"ds-markdown-paragraph\">Alternatively, set an\u00a0<code>$inject<\/code>\u00a0property on the controller function:<\/p>\r\n<div class=\"md-code-block md-code-block-dark\">\r\n<div class=\"md-code-block-banner-wrap\">\r\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\r\n<div class=\"_121d384\">\r\n<div class=\"d2a24f03\"><span class=\"d813de27\">javascript<\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<pre>angular<span class=\"token punctuation\">.<\/span><span class=\"token function\">module<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'myApp'<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">.<\/span><span class=\"token function\">controller<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'MyController'<\/span><span class=\"token punctuation\">,<\/span> MyController<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\nMyController<span class=\"token punctuation\">.<\/span>$inject <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">'$scope'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">'MyService'<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">function<\/span> <span class=\"token function\">MyController<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">$scope<span class=\"token punctuation\">,<\/span> MyService<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n <span class=\"token comment\">\/\/ ...<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\r\n<\/div>\r\n<p class=\"ds-markdown-paragraph\"><strong>Both approaches work<\/strong>\u00a0for mocking in tests. The key is listing dependencies explicitly to ensure they resolve correctly after code minification.<\/p>\r\n<h2><strong>Conclusion of our AngularJS Testing Tutorial<\/strong><\/h2>\r\n<p class=\"ds-markdown-paragraph\"><strong>Congratulations on making it through our AngularJS testing tutorial!<\/strong>\u00a0You now have the fundamental knowledge and skills to start building robust test suites for your AngularJS applications.<\/p>\r\n<p class=\"ds-markdown-paragraph\"><strong>While<\/strong>\u00a0testing may seem daunting at first, sticking with it pays huge dividends in application stability, faster delivery, and improved user experience.\u00a0<strong>Remember to<\/strong>\u00a0apply testing best practices like isolation, mocking, and readable test organization.<\/p>\r\n<p class=\"ds-markdown-paragraph\"><strong>This was just the beginning.<\/strong>\u00a0There is so much more to explore, such as testing directives, visual regression testing, and advanced techniques for tricky test scenarios.<\/p>\r\n<p class=\"ds-markdown-paragraph\"><strong>The key is to<\/strong>\u00a0stay positive, start testing early, refactor regularly, and reach out when you need help.\u00a0<strong>Most importantly,<\/strong>\u00a0continual practice will cement what you&#8217;ve learned and build real confidence.<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>Welcome to this hands-on AngularJS testing tutorial for beginners! Testing is crucial for building robust AngularJS applications, yet many developers find it challenging. This tutorial aims to make testing Angular code straightforward through easy-to-follow examples. Following core testing principles around isolation and mocking, you will gain practical experience creating maintainable tests that catch issues rapidly.\u00a0By [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"content-type":"","om_disable_all_campaigns":false,"footnotes":""},"categories":[919],"tags":[],"class_list":{"0":"post-5597","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-performance-testing"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>AngularJS Testing: Beginner&#039;s Guide to Unit &amp; E2E Tests<\/title>\n<meta name=\"description\" content=\"Learn how to do effectively AngularJS Testing applications using Cypress, Karma, and Protractor. This comprehensive tutorial covers essential\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"AngularJS Testing: Beginner&#039;s Guide to Unit &amp; E2E Tests\" \/>\n<meta property=\"og:description\" content=\"Learn how to do effectively AngularJS Testing applications using Cypress, Karma, and Protractor. This comprehensive tutorial covers essential\" \/>\n<meta property=\"og:url\" content=\"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/\" \/>\n<meta property=\"og:site_name\" content=\"blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prometteurSolutions\/timeline\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-17T08:02:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-29T09:52:42+00:00\" \/>\n<meta name=\"author\" content=\"Anil G\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@Iamprometteur\" \/>\n<meta name=\"twitter:site\" content=\"@Iamprometteur\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Anil G\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/\"},\"author\":{\"name\":\"Anil G\",\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#\/schema\/person\/a4ae2ebbf137687ec279232c86263362\"},\"headline\":\"AngularJS Testing Tutorial for Beginners\",\"datePublished\":\"2023-04-17T08:02:00+00:00\",\"dateModified\":\"2025-10-29T09:52:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/\"},\"wordCount\":1760,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#organization\"},\"articleSection\":[\"Performance testing\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/\",\"url\":\"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/\",\"name\":\"AngularJS Testing: Beginner's Guide to Unit & E2E Tests\",\"isPartOf\":{\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#website\"},\"datePublished\":\"2023-04-17T08:02:00+00:00\",\"dateModified\":\"2025-10-29T09:52:42+00:00\",\"description\":\"Learn how to do effectively AngularJS Testing applications using Cypress, Karma, and Protractor. This comprehensive tutorial covers essential\",\"breadcrumb\":{\"@id\":\"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/prometteursolutions.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"AngularJS Testing Tutorial for Beginners\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#website\",\"url\":\"https:\/\/prometteursolutions.com\/blog\/\",\"name\":\"blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/prometteursolutions.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#organization\",\"name\":\"blog\",\"url\":\"https:\/\/prometteursolutions.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/prometteursolutions.com\/blog\/wp-content\/uploads\/2021\/04\/new-logo.png\",\"contentUrl\":\"https:\/\/prometteursolutions.com\/blog\/wp-content\/uploads\/2021\/04\/new-logo.png\",\"width\":211,\"height\":60,\"caption\":\"blog\"},\"image\":{\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/prometteurSolutions\/timeline\/\",\"https:\/\/x.com\/Iamprometteur\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#\/schema\/person\/a4ae2ebbf137687ec279232c86263362\",\"name\":\"Anil G\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/28ee72234de5cc37a72e64d1f123446e4b4f7dc1d79e3254b48ff8ecf91e27e5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/28ee72234de5cc37a72e64d1f123446e4b4f7dc1d79e3254b48ff8ecf91e27e5?s=96&d=mm&r=g\",\"caption\":\"Anil G\"},\"url\":\"https:\/\/prometteursolutions.com\/blog\/author\/newadmin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"AngularJS Testing: Beginner's Guide to Unit & E2E Tests","description":"Learn how to do effectively AngularJS Testing applications using Cypress, Karma, and Protractor. This comprehensive tutorial covers essential","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/","og_locale":"en_US","og_type":"article","og_title":"AngularJS Testing: Beginner's Guide to Unit & E2E Tests","og_description":"Learn how to do effectively AngularJS Testing applications using Cypress, Karma, and Protractor. This comprehensive tutorial covers essential","og_url":"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/","og_site_name":"blog","article_publisher":"https:\/\/www.facebook.com\/prometteurSolutions\/timeline\/","article_published_time":"2023-04-17T08:02:00+00:00","article_modified_time":"2025-10-29T09:52:42+00:00","author":"Anil G","twitter_card":"summary_large_image","twitter_creator":"@Iamprometteur","twitter_site":"@Iamprometteur","twitter_misc":{"Written by":"Anil G","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/#article","isPartOf":{"@id":"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/"},"author":{"name":"Anil G","@id":"https:\/\/prometteursolutions.com\/blog\/#\/schema\/person\/a4ae2ebbf137687ec279232c86263362"},"headline":"AngularJS Testing Tutorial for Beginners","datePublished":"2023-04-17T08:02:00+00:00","dateModified":"2025-10-29T09:52:42+00:00","mainEntityOfPage":{"@id":"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/"},"wordCount":1760,"commentCount":0,"publisher":{"@id":"https:\/\/prometteursolutions.com\/blog\/#organization"},"articleSection":["Performance testing"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/","url":"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/","name":"AngularJS Testing: Beginner's Guide to Unit & E2E Tests","isPartOf":{"@id":"https:\/\/prometteursolutions.com\/blog\/#website"},"datePublished":"2023-04-17T08:02:00+00:00","dateModified":"2025-10-29T09:52:42+00:00","description":"Learn how to do effectively AngularJS Testing applications using Cypress, Karma, and Protractor. This comprehensive tutorial covers essential","breadcrumb":{"@id":"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/prometteursolutions.com\/blog\/angularjs-testing-tutorial-cypress-karma-and-protractor\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/prometteursolutions.com\/blog\/"},{"@type":"ListItem","position":2,"name":"AngularJS Testing Tutorial for Beginners"}]},{"@type":"WebSite","@id":"https:\/\/prometteursolutions.com\/blog\/#website","url":"https:\/\/prometteursolutions.com\/blog\/","name":"blog","description":"","publisher":{"@id":"https:\/\/prometteursolutions.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/prometteursolutions.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/prometteursolutions.com\/blog\/#organization","name":"blog","url":"https:\/\/prometteursolutions.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/prometteursolutions.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/prometteursolutions.com\/blog\/wp-content\/uploads\/2021\/04\/new-logo.png","contentUrl":"https:\/\/prometteursolutions.com\/blog\/wp-content\/uploads\/2021\/04\/new-logo.png","width":211,"height":60,"caption":"blog"},"image":{"@id":"https:\/\/prometteursolutions.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/prometteurSolutions\/timeline\/","https:\/\/x.com\/Iamprometteur"]},{"@type":"Person","@id":"https:\/\/prometteursolutions.com\/blog\/#\/schema\/person\/a4ae2ebbf137687ec279232c86263362","name":"Anil G","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/prometteursolutions.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/28ee72234de5cc37a72e64d1f123446e4b4f7dc1d79e3254b48ff8ecf91e27e5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/28ee72234de5cc37a72e64d1f123446e4b4f7dc1d79e3254b48ff8ecf91e27e5?s=96&d=mm&r=g","caption":"Anil G"},"url":"https:\/\/prometteursolutions.com\/blog\/author\/newadmin\/"}]}},"_links":{"self":[{"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/posts\/5597","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/comments?post=5597"}],"version-history":[{"count":8,"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/posts\/5597\/revisions"}],"predecessor-version":[{"id":19172,"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/posts\/5597\/revisions\/19172"}],"wp:attachment":[{"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/media?parent=5597"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/categories?post=5597"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/tags?post=5597"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}