禁用PhantomJS上的LocalStorage以进行干净测试



几天前刚开始使用CasperJS。

我今天创建了一个脚本来测试LocalStorage的行为,以及我是否可以禁用它,因为这是防止测试相互影响所必需的。

背景

我正在开发一个主干向导,该向导要求在第一页上输入一个值。当您单击"继续"按钮时,它会将值保存到LocalStorage,然后在第二页上显示。

我同时使用casperjs test <script.js>和不使用--local-storage-quota=0

第一次尝试

编写了一个执行以下操作的CasperJS脚本:

  1. 加载页面
  2. 检查模型的内容(应该是空的)
  3. 单击"继续"
  4. 在第2页加载后检查模型的内容(应该包含值)
  5. 使用casper直接将第2页作为新页打开。thenOpen()
  6. 加载第2页后检查模型的内容

如果启用了LocalStorage,步骤6的结果应该与步骤4相同(模型中存在值)。

如果LocalStorage被禁用,步骤6的结果应该与步骤2相同(模型为空)。

每次运行脚本时,我都确定LocalStorage已启用。"--本地存储配额=0"参数没有任何区别。

第二次尝试

在这一点上,我决定确定LocalStorage是否连接到特定的Casper实例。如果是这样的话,那么我可以通过为每个测试创建一个新的Casper实例来解决这个问题,从而从头开始。

var Casper = require( 'casper' );
casper = Casper.create();
casper.test.begin( 'test for Local Storage, part 1', 0, function suite (test) { ... });
casper = Casper.create();
casper.test.begin( 'test for Local Storage, part 2', 0, function suite (test) { ... });

然而,第二个测试套件从未运行过。我不知道Casper是不是打算在同一个脚本中创建多个实例,或者我只是组织不正确。

附录

我应该补充一点,所有测试套件都以以下步骤结束,以防相关:

casper.run( function () {
    test.done();
    casper.exit();
});

文档仅指定test.done()是必需的。然而,我的测试脚本将永远挂起,直到我添加对casper.exit().

的调用

您不能在phantomjs中禁用localStorage或sessionStorage。但是,建议每次运行测试时都清理执行环境。我建议添加完整设置的通用测试功能,如下所示:

function beginTest(casper, description, num, tests){
    function clearStorage(){
        casper.evaluate(function() {
            localStorage.clear();
            sessionStorage.clear();
        });
    }
    // Select between two possible signatures and queue a casper test
    if (typeof num == "number" && typeof tests == "function") {
        casper.test.begin(description, num, function suite(test){
            phantom.clearCookies();
            casper.start(config.baseurl, clearStorage);
            tests(test);
            casper.run(function(){
                test.done();
            });
        });
    } else if (typeof num == "function" && !tests) {
        casper.test.begin(description, function suite(test){
            phantom.clearCookies();
            casper.start(config.baseurl, clearStorage);
            num(test);
            casper.run(function(){
                test.done();
            });
        });
    }
}

然后你可以用调用它

beginTest(casper, 'test for Local Storage, part 1', 0, function suite(test){ /* ... */ });
beginTest(casper, 'test for Local Storage, part 2', 0, function suite(test){ /* ... */ 

最新更新