How do I reliably execute Jasmine tests that utilize requirejs via phantomjs?

后端 未结 2 1809
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-17 04:55

I am using phantomjs to run jasmine test. My jasmine tests are using require around the describe blocks to ensure all the right modules are loaded.

My tests would no

2条回答
  •  佛祖请我去吃肉
    2020-12-17 05:31

    My solution, with jQuery available, is this:

    Load a config file before any of your tests run.

    var jasmine_deferreds = [];
    
    // Setup an event to fire on the document
    // I actually did this with native code rather than jquery because
    // I wanted to minimize jquery usage
    
    // ....
    
    // setTimeout so all files loaded after this will finish registering their requires
    setTimeout( function() {
    
      $.when.apply( null, jasmine_deferreds ).then( function() {
    
        // Fire event that was created
    
      });
    
    }, 5 );
    

    It's up to you how you want to build up the array of deferreds and then resolve them. I essentially pushed to the array and then resolved when the require was done. I wrapped require with my own version that would know to resolve it upon completion automatically - so I don't need to push and resolve manually in each test.

    Then in my phantom file I do this:

    page.evaluate ->
        mylistener = ( document ) -> jasmine.getEnv().execute();
        document.addEventListener( 'test_ready_event', mylistener, false);
    

    This makes it so I know all my require modules are loaded without having some arbitrary setTimeout that could be too short once I am loading too many files. The one setTimeout I'm using is safe because it's only being used to fire after main callstack is done. It doesn't really care about the time.

提交回复
热议问题