使用karma,jasmine,jquery进行测试并使用browserify进行反应

时间:2015-04-17 12:47:39

标签: jquery unit-testing jasmine

我目前正在开始一个项目,我很乐意使用react js。但在我开始之前,我需要找出一个好的工作流程,包括单元测试等。我遇到的第一个问题是,Jest目前有一个错误,它会让它很快崩溃(“jquery”)。因为我无法找到调试Jest测试的方法,所以我决定尝试使用karma和jasmine。我现在遇到的问题是,当我尝试测试ajax调用时,我从未得到响应。

该服务的当前变化是:

var _isTesting = false;
var deferred;
var TestService = {

 loginUser:function(username, password){

    var data = {
        username: username,
        password: password
    };
    console.log("calling ajax");

    return ($.ajax({
        type: "POST",
        url: "https://test.com/service",
        data:data,
        dataType:"json"
    }));

  }
};
module.exports =TestService;

测试看起来像这样:

describe('TestService', function(){
var onSuccess, onFailure, request;

var service = {};

beforeEach(function(){
    jasmine.Ajax.install();
    service = require("../js/services/TestService");
    onSuccess = jasmine.createSpy('onSuccess');
    onFailure = jasmine.createSpy('onFailure');
});

it('should set the testing variable', function(){
    expect(service.getIsTesting()).toBe(false);
    service.setIsTesting(true);
    expect(service.getIsTesting()).toBe(true);
});

it('should log in', function(){
    var def =  service.loginUser("username", "password");

    def.done(function(result){
            console.log("#######" + JSON.stringify(result))
            onSuccess(result);
        })
        .fail(function(error){
            console.log("#### ERROR ###"+JSON.stringify(error));
            onFailure(error);
        });

    request = jasmine.Ajax.requests.mostRecent();
    expect(request.url).toBe("https://test.com/service");
    expect(request.method).toBe('POST');

    expect(onSuccess).toHaveBeenCalled();
})
});

预期的第一个会成功但第三个会失败,那就是我从来没有得到ajax电话的响应。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

查看Jasmine文档(http://jasmine.github.io/2.2/ajax.html),您需要告诉框架从模拟的AJAX调用返回数据 - 它不会自动响应任何内容。尝试类似:

....
expect(request.method).toBe('POST');

//respond to AJAX call
request.respondWith({
    "status": 200,
    "responseText": "some return data"
});

//now check that your success method was called
expect(onSuccess).toHaveBeenCalled();

除了Jest之外 - 它目前还不支持别名,这就是为什么require('jquery')通话无法正常工作的原因。 (请参阅此拉取请求:https://github.com/facebook/jest/pull/237)。我没有试过这个,但如果你使用完整路径来要求jquery而不是别名,你可能会让Jest工作。像require('../node_modules/jquery');这样的东西很烦人,这就是为什么我可能会和Karma / Jasmine一起去做一个新项目。