javascript - 使用 karma 和 jasmine 获取 json 文件的 ajax 自定义实现调用的 404

标签 javascript ajax jasmine karma-runner

我对 karma 和 Jasmine 比较陌生。我喜欢这种语法,但现在我写的自定义 ajax 函数有问题:

function ajax(options, callback) {
    var xmlhttp;

    if (window.XMLHttpRequest) {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    } else {
        // code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == XMLHttpRequest.DONE) {
            if (xmlhttp.status == 200) {
                callback(xmlhttp);
            } else if (xmlhttp.status == 404) {
                callback(null, xmlhttp);
            } else {
                callback(null, xmlhttp);
            }
        }
    };

    xmlhttp.open(options.method, options.url, true);
    xmlhttp.send(options.data);
}

所以在我的测试文件中:

describe('ajax', function() {
describe('$.ajax', function() {
    it('should be able to get data', function(done) {
        $.ajax({
            url: 'test.json',
            method: 'GET'
        }, function(data, err) {
            expect(data).toBeDefined();
            console.log(data);
            console.log(err);
            done();
        });
    });
});
});

它返回一个带有 404 错误的 xhr 对象。仔细检查 PhantomJS 说:[web-server]: 404:/test.json。在搜索了一些答案后,我尝试了代理,但仍然返回 404。

顺便说一句,这不使用 jquery。它是一个自定义实现,设置在编写的 $ 模块上。所有 src 代码都在 vanilla JS 中。

那么如何让ajax函数能够访问json文件呢。我的根文件结构是:

/
--src 
  --js 
--tests 
--karma.conf.js

我已经将 test.json 文件放在 src 和 test 目录中。

最后是我的 karma.conf.js:

// karma.conf.js
module.exports = function(config) {
  config.set({
    frameworks: ['jasmine'],
    reporters: ['spec'],
    browsers: ['PhantomJS'],
    files: [
      'src/js/**/*.js',
      'tests/*.js'
    ]

  });
};

如果您发现它相关,这将由 Gulp 处理。

最佳答案

好的,我明白了。这非常令人困惑,而且没有太多关于它的信息。要访问项目中的 json 文件,您需要使用 karma.conf.js 文件。在我的例子中,我不得不改变这个:

module.exports = function(config) {
  config.set({
    frameworks: ['jasmine'],
    reporters: ['spec'],
    browsers: ['PhantomJS'],
    files: [
      'src/js/**/*.js',
      'tests/*.js'
    ]

  });
};

为此:

module.exports = function(config) {
config.set({
    frameworks: ['jasmine'],
    reporters: ['spec'],
    browsers: ['PhantomJS'],
    files: [
        'src/js/**/*.js',
        'tests/*.js', {
            pattern: 'tests/*.json',
            served: true,
            included: false
        }
    ],
    proxies: {
        '/tests/': '/base/tests/'
    }

});
};

模式部分是在不引发可怕错误的情况下抓取 json 文件的部分。显然这些被称为固定装置?

注意代理部分。我会尽量解释清楚。基本上,Karma 提供从链接到目录根目录的基本目录中的所有内容。现在,当我说 base 时,我不是指 root 或/,而是/base/。这就是我感到困惑的地方。

所以如果你有一个目录你想为你的 {pattern: 'spec/fixtures/*.json'} 提供服务,你将需要一个像这样的代理: proxies: { '/spec/fixtures/': '/base/spec/fixtures/' } 然后你在测试中的 ajax 调用将转到 url spec/fixtures/test.json

关于javascript - 使用 karma 和 jasmine 获取 json 文件的 ajax 自定义实现调用的 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34754494/

相关文章:

javascript - 如何使用 Node 找出大型 JSON 文件的结构?

javascript - 添加向左/向右滑动到网页,但使用默认向上/向下滑动

javascript - 检测 Ajax 调用中的 Javascript 篡改

asp.net - WCF 和 ASP.NET session 共享

javascript - 使用ajax获取数据时出错

angular - ng-bootstrap Angular 配置 karma Jasmine

javascript - JQuery隐藏div之外的span

javascript - angularjs 使用多个数组以 json 格式将数据发送到 mvc Controller

angularjs - 模块 'templates' 不可用!在 Angular js 中?

javascript - 如何在 Jasmine 中包含 HBS 模板?