0

我是编程新手,我正试图弄清楚如何用 jasmine 对 angularJS 代码进行单元测试,这让我发疯了!

这是我试图测试的角度代码,它全部设置在使用 abpBoilerplate 和角度的 asp.net Web 应用程序上。下面代码的结果是,当在网页上单击按钮时,会出现“成功”弹出窗口,并且如果服务可用,则文本框中会出现“真”。该服务是从 web api 项目中的类中提取的。

(function() {
    var controllerId = 'app.views.home';
    angular.module('app').controller(controllerId, [
        '$scope', 'abp.services.lfcservice.webapi', function($scope,lfcServices) {
            var vm = this;

            //Home logic...

            vm.CheckLfcIsAvailable = function () {
                lfcServices.lfcIsAvailable()
                    .success(function () {
                        abp.notify.info('Success');
                        vm.Available = 'True';
                    });
                };

我只需要知道如何编写一个 jasmine 测试,该测试在它期望 lfc 服务的真实值时通过。我尝试了很多不同的组合都没有成功,我可以在这里粘贴 10 种不同的尝试,但它们都非常不同。

任何帮助将非常感激!

4

1 回答 1

1

首先,您需要知道如何测试控制器,模拟服务。然后,您需要模拟服务 API 以返回一个承诺。

假设控制器以Available = false;.

测试一个 Angular 1.x 控制器(参见jsFiddle):

describe("app.views.home controller spec", function() {
    var ctrl;
    //depend on the module
    beforeEach(module('app'));

    beforeEach(inject(function($controller) {
        //use angular's "$controller" to get the controller
        ctrl = $controller("app.views.home");
    }));

    it("available should be false", function() {
        expect(ctrl.Available).toBe(false);
    });  
});

现在,让我们假设服务返回一个简单的结果(没有承诺),看看我们如何提供模拟服务而不是真实服务。

使用模拟服务测试 Angular 1.x 控制器(请参阅jsFiddle):

beforeEach(module(function($provide) {
    var mockService = jasmine.createSpyObj('mock', ['lfcIsAvailable']);
    mockService.lfcIsAvailable.and.returnValue(true);
    $provide.value('abp.services.lfcservice.webapi', mockService);
}));

现在,让我们看看如何模拟一个承诺响应。为此,我们将使用$q.

模拟 Angular 1.x 承诺(参见jsFiddle):

it('should change after promise resolved', inject(function($q, $rootScope) {
    //create promise
    var deferred = $q.defer();

    //mock service response 
    mockService.lfcIsAvailable.and.returnValue(deferred.promise);

    //call CheckLfcIsAvailable ()
    ctrl.CheckLfcIsAvailable ();

    expect(ctrl.Available).toBe(false);

    deferred.resolve(true);

    //not yet...
    expect(ctrl.Available).toBeNull(false);

    //from angular $q documentation: 
    //"it's important to know that the resolution of promises is tied to the digest cycle"
    $rootScope.$apply();

    //now!
    expect(ctrl.Available).toBe(true);

}));
于 2016-03-28T07:51:31.000 回答