赛普拉斯与SystemJS

蒂莫西·鲁尔(Timothy Ruhle)

我正在尝试创建一些基本测试来试用新的赛普拉斯库在我的测试中,我cy.visit('http://mywebsite.com');正在加载使用SystemJS的AngularJS应用。

如果我对Cypress的理解正确,则无需执行其他任何操作,它可以确保在运行其他任何操作之前已加载页面。但是,这似乎不起作用,因为页面已加载,但是SystemJS仍在加载模块。

在没有使用任何其他测试的情况下,如何让Cypress等待所有SystemJS模块加载cy.wait(5000)

编辑

感谢Dwelle,这是对我有用的解决方案。我将初始System.import包装在一个承诺中,一旦AngularJS应用程序被引导,该承诺将得到解决。

window.APP_READY = new Promise(function(resolve, reject) {
    System.import('app').then(function(app) {
        angular.element(document).ready(function() {
            angular.bootstrap(document, ['app']);
            resolve();
        });
    });
});

然后在测试

cy.visit('http://mywebsite.com').its('APP_READY');
住所

您不熟悉SystemJS或您的应用程序,但是如果我们假设您正在加载时进行异步工作,则可以设置一些全局属性来指示应用程序是否已就绪。

// your main.js
let _appReadyResolver;
window.APP_READY = new Promise( resolve => _appReadyResolver = resolve );

// do some async setup
setTimeout(() => {

    _appReadyResolver();
});

然后,在您的测试中:

cy.visit("/")
    // by default will wait 4sec for APP_READY prop to exist on
    //  window object (unfortunately I don't know how to increase timeouts
    //  of `cy.its` command)
    // After that, it will wait indefinitely for your promise to resolve
    .its("APP_READY")

话虽这么说---如果您没有在应用程序中进行任何异步设置,但是main.js只是异步加载,并且可能需要4秒钟以上的时间,那么我可以这样做:

// index.js
<script>
  SystemJS.import('/js/main.js');
  window.APP_READY = new Promise( resolve => {
    let interval = setInterval(() => {
        if ( window.MAIN_READY ) {
            resolve();
            clearTimeout(interval);
        };
  }, 100 );
</script>

// main.js
window.MAIN_READY = true;

您需要APP_READY从生产构建中剥离逻辑。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章