无法在使用Chutzpah的Visual Studio中加载jasmine-jquery fixture,甚至无法在浏览器中加载

时间:2012-12-07 18:41:30

标签: visual-studio jasmine jasmine-jquery chutzpah

我正在为MVC.NET 4.0应用程序进行原型设计,并定义了我们的Javascript测试配置。我设法让使用Chutzpah扩展的VS2012中的Jasmine工作,并且我能够成功运行纯Javascript测试。

但是,我无法加载测试夹具(DOM)代码并从我的测试中访问它。

以下是我试图运行的代码:

test.js

/// various reference paths...

jasmine.getFixtures().fixturesPath = "./";

describe("jasmine tests:", function () {
    it("Copies data correctly", function () {
        loadFixtures('testfixture.html');
        //setFixtures('<div id="wrapper"><div></div></div>');
        var widget = $("#wrapper");
        expect(widget).toExist();
    });
});

灯具与测试文件位于同一文件夹中。 setFixtures操作有效,但是当我尝试从文件加载HTML时,它不会。最初,我尝试从存储库中使用最新版本的jasmine-jquery,但后来又回到了超过1年的下载版本1.3.1,因为看起来新版本中存在一个错误。这是我用1.3.1获得的信息:

  

测试'茉莉花测试::正确复制数据'失败           错误:无法加载Fixture:./ testfixture.html(status:error,message:undefined)in file:/// C:/Users/db66162/SvnProjects/MvcPrototype/MvcPrototype.Tests/Scripts/jasmine/jasmine-jquery -1.3.1.js(第103行)

当我检查源代码时,它正在进行AJAX调用,但我没有在浏览器中运行。相反,我正在使用Chutzpah,它运行无头浏览器(PhantomJS)。当我在浏览器中使用测试工具运行它时,它确实有效。

那里有人有解决这个问题的方法吗?我需要能够在Visual Studio和TeamCity中自动运行这些测试(这就是我使用Chutzpah的原因)。我愿意接受使用另一个测试运行器代替Chutzpah的解决方案。我也将在这项工作中评估qUnit测试框架,所以如果你知道qUnit在我的配置中没有这个问题,我会发现它很有用。

3 个答案:

答案 0 :(得分:1)

我通过将以下设置添加到chutzpah.json来修复此问题:

"TestHarnessLocationMode": "SettingsFileAdjacent",

chutzpah.json在我的测试应用根

答案 1 :(得分:0)

我有完全相同的问题。 AFAIK与jasmine-jquery有关,当通过file:// URI方案运行测试时,尝试通过Ajax加载fixture。

显然Chrome不允许这样做(请参阅https://stackoverflow.com/a/5469527/1904http://code.google.com/p/chromium/issues/detail?id=40787),其他浏览器支持可能会有所不同。

修改

通过尝试设置一些PhantomJS命令行选项(例如--web-security=false),可能感到高兴。 YMMV虽然:我还没有尝试过这个,但我想如果它有用(或者如果其他人知道更多关于这个选项以及它是否有帮助的话)我会提到它。

更新

通过在我的Jasmine规范的顶部添加/// <reference path="relative/path/to/fixtures" />评论来设法加载HTML工具。但是我仍然无法加载JSON灯具。

进一步更新

通过添加/// <reference path="relative/path/to/fixtures" />注释来加载HTML工具只会在您的HTML工具中加载到Jasmine测试运行器,这可能适合您的需求,也可能不适合您。 没有将灯具加载到jasmine-fixtures元素中,因此每次测试后都不会清理灯具。

答案 2 :(得分:0)

我最终解决了问题。谢谢Ian的回复。我可以在TeamCity中使用PhantomJS来通过测试运行器运行测试。我联系了Chutzpah的作者,他为他的产品部署了一个更新,解决了我在Visual Studio中遇到的问题。我现在可以使用Chutzpah约定运行Jasmine测试来引用库并在VS中包含fixture,并使用TeamCity中的PhantomJS运行器来使用测试运行器(html)。

我在TeamCity上的解决方案是运行一个启动测试的批处理文件。那么,批次:

@echo off
REM -- Uses the PhantomJS headless browser packaged with Chutzpah to run 
REM -- Jasmine tests.  Does not use Chutzpah.
setlocal
set path=..\packages\Chutzpah.2.2.1\tools;%path%;
echo ##teamcity[message text='Starting Jasmine Tests']
phantomjs.exe phantom.run.js %1
echo ##teamcity[message text='Finished Jasmine Tests']

和Javascript(phantom.run.js):

// This code lifted from https://gist.github.com/3497509.
// It takes the test harness HTML file URL as the parameter.  It launches PhantomJS,
// and waits a specific amount of time before exit.  Tests must complete before that 
// timer ends.  
(function () {
    "use strict";
    var system = require("system");
    var url = system.args[1];

    phantom.viewportSize = {width: 800, height: 600};

    console.log("Opening " + url);

    var page = new WebPage();

    // This is required because PhantomJS sandboxes the website and it does not
    // show up the console messages form that page by default
    page.onConsoleMessage = function (msg) {
        console.log(msg);

        // Exit as soon as the last test finishes.
        if (msg && msg.indexOf("Dixi.") !== -1) {
            phantom.exit();
        }
    };

    page.open(url, function (status) {
        if (status !== 'success') {
            console.log('Unable to load the address!');
            phantom.exit(-1);
        } else {
            // Timeout - kill PhantomJS if still not done after 2 minutes.
            window.setTimeout(function () {
                phantom.exit();
            }, 10 * 1000); // NB: use accurately, tune up referring to your needs
        }
    });
}());