用Jasmine测试服务函数POST响应

我不完全确定如何做到这一点,但我有一个端点URL,这是一个POST请求登录身份验证。 当您添加请求负载时,您将获得成功的登录凭证或错误。 但是,我似乎在获取响应时遇到了问题。

这是我的spec文件:

describe('Service: AuthFactory',function(){

    beforeEach(function () {
        module('ui.router');
        module('users');
        module('main');
    });

    var AuthFactory, httpBackend;

    beforeEach(inject(function($httpBackend, $rootScope, $controller, _AuthFactory_){
        httpBackend = $httpBackend;
        AuthFactory = _AuthFactory_;

    }));

    it('Return a POST response from a Service function', function() {
        var url = "http://localhost:3000";
        var dataObj = JSON.stringify({
            inputUser: { user: "TestCase1" },
            inputPass: { password: "TestPass1" }
        });
        httpBackend.expect('POST', url + '/api/AuthService/signIn', dataObj)
            .respond({});

        AuthFactory.signIn(dataObj).success(function(response) {
            console.log(response);
            // outputs Object {}
            // when in reality it should
            // output the response to POST
            // eg: { "login": { "user": "Test_User", "time": 54935934593 }, "outputHead": { "token": asjfjj234kfAd } }
        });

        httpBackend.flush();

        expect(true).toBe(true);
    });
});

这是我的Service

angular.module('users').factory('AuthFactory', ['$http', function($http) {

var AuthFactory = {};

AuthFactory.signIn = function(data) {
    return $http.post('http://127.0.0.1:3000/api/AuthService/signIn', data);
};

AuthFactory.signOut = function(data) {
    return $http.post('http://127.0.0.1:3000/api/AuthService/signOut', data);
};

return AuthFactory;

}]);

当我运行测试时,它通过(显然),但console.log()输出Object{}

当我使用邮局等Chrome扩展。 我做了一个示例POST请求,返回的响应是登录凭证! 那么为什么它在Postman上工作,而不是在我的AngularJS Jasmine单元测试上呢?


这条线是为什么你得到一个空的对象作为你的回应:

httpBackend.expect('POST', url + '/api/AuthService/signIn', dataObj)
        .respond({});

为了给你想要的回应,只需添加以下内容:

httpBackend.expect('POST', url + '/api/AuthService/signIn', dataObj)
            .respond({"login": { "user": "Test_User", "time": 54935934593 }, "outputHead": { "token": asjfjj234kfAd }});

有关更多信息,请参阅文档。


要记住的主要事情是,你正在嘲笑后端服务请求,而不是实际触及服务。 这是通过以下声明完成的:

httpBackend.expect('POST', url + '/api/AuthService/signIn', dataObj)
    .respond({});

这说的是一个匹配这个URL的POST,伪造一个空对象的响应。 如果你想伪造一个看起来像你真实的响应的响应,你可以简单地在.response函数调用中设置该对象。

例:

.respond({login:myuser,authenticated=true}).

如果您试图测试您的后端API,您将需要查看其他测试框架,如量角器;


你使用$ httpBackend服务来嘲弄你的后端,这意味着,不会有真正的请求,但是当你发布到url + '/api/AuthService/signIn'你的url + '/api/AuthService/signIn'后端将用一个空对象( .respond({}) )您应该使用与您的真实后端返回的数据相同的数据进行响应。 主要的一点是,你可以控制你的测试需要覆盖哪些案例。 因此,您可以编写失败或成功登录的API响应

如果你在邮递员的请求,这将使用你的真正的后端,这是不同的

更多信息:https://docs.angularjs.org/api/ngMock/service/$httpBackend http://www.yearofmoo.com/2013/01/full-spectrum-testing-with-angularjs-and-karma.html

链接地址: http://www.djcxy.com/p/41095.html

上一篇: Testing a service function POST response with Jasmine

下一篇: HttpWebRequest with POST and GET at the same time