0 votes
1 view
in Devops and Agile by (15.5k points)

I am writing a test case for adding store information on the page for the Angular app using Protractor, where initially I am counting the number of stores I already have and after the test block is done I expect the count to increase by one.

  var items,startCount;

  var testPromise = function(){

    items = element.all(by.repeater('store in storelist'));

    var deferred = protractor.promise.defer();

    items.count().then(function(orgCount){

       startCount = orgCount;

       console.log('Start Count: '+ startCount); //prints correct value e.g, 6

    }, function(error){

       console.log(error);

    });

    return deferred.promise;

  };

it('should accept valid data for adding new store', function() {

   var cNum = null;

   testPromise().then(function(result){

      cNum = result;

      console.log('cNUm value: '+ cNum); //this value doesn't get printed in console

   });

   /* Code for adding test fields in store page */

   expect(items.count()).toBe(cNum+1);

 });

});

I expect the store count to be the same at the end of the test. count() is resolving a promise and the correct value of store count gets printed in testPromise() but in it block when I call testPromise().then method it never goes in that 'then' block

and the end result says

Message:

 Expected 6 to be 1.

 Stacktrace:

  Error: Failed expectation

I also researched a bit more in webdriver.promise.Promise() from this link http://selenium.googlecode.com/git/docs/api/javascript/class_webdriver_promise_Promise.htmland tried using that for creating a promise and resolving its value but not sure what the problem is. Either I get an error message saying 'expected 6 to be NaN' or 'expected 6 to be 1' Am I not resolving a promise or writing 'then' block correctly? Would appreciate some insights/help on this issue.

1 Answer

0 votes
by (43.1k points)

Creation

To create a promise in protractor, use the following code snippet:

var deferred = protractor.promise.defer();

var promise = deferred.promise;

Callbacks

The callbacks are invoked asynchronously.

You would be able to register one (or more) "on success" callbacks using the following code snippet:

promise.then(function() {

   ...

});

you can additionally register one (or more) "on error" callback:

 

promise.then(null, function() {

   ...

});

These registrations could be chained:

promise.then(function() {

   ...

}).then(function() {

   ...

}).then(null, function() {

   ...

}).then(function() {

 

}, function() {

   ...

}).then(onSuccess, onFailure);

Resolution

Success

The "on success" callbacks are invoked once the promise is resolved successfully:

 deferred.fulfill(value);

Failure

The "on failure" callbacks are invoked once the promise is resolved successfully:

deferred.reject(new Error('a problem occurs'));

In your code, you missed the resolution step. You have to fulfill the promise. A more complete reference is obtainable within the Webdriver.js documentation

...