Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
590 views
in Technique[技术] by (71.8m points)

angularjs - creating and resolving promises in protractor

I am writing a test case for adding store information in the page for 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 so for that I am doing this by following this link of creating promises How to create and manipulate promises in Protractor?

describe('myApp', function() {
  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 same at the end of the test. count() is resolving a promise and 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.html and tried using that for creating a promise and resolving its value but not sure what the problem is. Either I get 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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Creation

For creating a promise in protractor, you have to write:

var deferred = protractor.promise.defer();
var promise = deferred.promise;

Callbacks

The callbacks are invoked asynchronously. You can register one (or more) "on success" callbacks:

promise.then(function() {
   ...
});

you can also 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 when the promise is resolved successfully:

deferred.fulfill(value);

Failure

The "on failure" callbacks are invoked when 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 available in the Webdriver.js documentation


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...