获得404关于使用karma和jasmine对json文件进行ajax调用的自定义实现

Getting 404 on custom implementation of ajax call for json file with karma and jasmine

本文关键字:ajax 调用 实现 自定义 文件 json 于使用 karma jasmine 获得      更新时间:2023-09-26

我对因果报应和茉莉花相对陌生。我喜欢它的语法,但现在我在编写自定义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代码都是用vanillaJS编写的。

那么,我如何让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或/,its/base/。这就是我感到困惑的地方。

因此,如果您有一个目录要为{pattern: 'spec/fixtures/*.json'}提供服务,那么您将需要一个类似于proxies: { '/spec/fixtures/': '/base/spec/fixtures/' }的代理,然后您在测试中的ajax调用将转到url spec/fixtures/test.json