Angularjs   发布时间:2022-04-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了单元测试 – 如何使用jasmine模拟Angular服务?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
这可能是重复的,但我在这里看了很多其他问题,他们通常会以某种方式错过我正在寻找的东西.他们主要谈论他们自己创造的服务.我能做到并做到了.我试图覆盖我的模拟注入的角度.我认为它会是相同的,但由于某些原因,当我单步执行代码时,它始终是角度$cookieStore而不是我的模拟.

我对jas@L_262_2@和angularjs的经验非常有限.我来自C#背景.我经常编写单元测试moq(C#的模拟框架).我习惯看到这样的事情

[TESTClass]
public PageControllerTests
{
    private mock<ICookieStore> mockCookieStore;
    private PageController controller;

    [TesTinitialize]
    public void SetUp()
    {
        mockCookieStore = new mock<ICookieStore>();
        controller = new PageController(mockCookieStore.object);
    }

    [TestMethod]
    public void GetsCarsFromCookieStore()
    {
        // Arrange
        mockCookieStore.Setup(cs => cs.Get("cars"))
                    .Return(0);

        // Act
        controller@L_45_4@meMethod();

        // Assert
        mockCookieStore.VerifyAll();
    }
}

我想模拟我在我的一个控制器中使用的$cookieStore服务.

app.controller('PageController',['$scope','$cookieStore',function($scope,$cookieStorE) {

    $scope.cars = $cookieStore.get('cars');

    if($scope.cars == 0) {
            // Do other logic here
            .
    }

    $scope.foo = function() {
        .
        .
    }
}]);

我想确保使用’garage’参数调用$cookieStore.get方法.我也希望能够控制它的回馈.我希望它返回0然后我的控制器必须做一些其他逻辑.

这是我的测试.

describe('Controller: PageController',function () {

    var controller,scope,cookieStoreSpy;

    beforeEach(function () {
        cookieStoreSpy = jas@L_262_2@.createSpyObj('CookieStore',['get']);
        cookieStoreSpy.get.andReturn(function(key) {
            switch (key) {
                case 'cars':
                    return 0;
                case 'bikes':
                    return 1;
                case 'garage':
                    return { cars: 0,bikes: 1 };
            }
        });

        module(function($providE) {
            $provide.value('$cookieStore',cookieStoreSpy);
        });
        module('App');

    });

    beforeEach(inject(function(_$httpBACkend_,$rootScope,$controller) {
        scope = $rootScope.$new();
        controller = $controller;
    }));

    it('Gets car from cookie',function () {
        controller('PageController',{ $scope: scope });
        expect(cookieStoreSpy.get).toHaveBeenCalledWith('cars');
    });
});

解决方法

这是我之前回答中讨论的解决方案.

在我的控制器中,我使用$LOCATIOn.path和$LOCATIOn.search.所以用我的模拟覆盖$LOCATIOn我做了

LOCATIOnmock = jas@L_262_2@.createSpyObj('LOCATIOn',['path','search']);
LOCATIOnmock.LOCATIOn = "";

LOCATIOnmock.path.andCallFake(function(path) {
  console.log("### Using LOCATIOn set");
  if (typeof path != "undefined") {
    console.log("### SetTing LOCATIOn: " + path);
    this.LOCATIOn = path;
  }

  return this.LOCATIOn;
});

LOCATIOnmock.search.andCallFake(function(query) {
  console.log("### Using LOCATIOn search mock");
  if (typeof query != "undefined") {
    console.log("### SetTing search LOCATIOn: " + JSON.Stringify(query));
    this.LOCATIOn = JSON.Stringify(query);
  }

  return this.LOCATIOn;
});

module(function($providE) {
  $provide.value('$LOCATIOn',LOCATIOnmock);
});

我没有在$controller中注入任何东西.它刚刚起作用.看看日志:

大佬总结

以上是大佬教程为你收集整理的单元测试 – 如何使用jasmine模拟Angular服务?全部内容,希望文章能够帮你解决单元测试 – 如何使用jasmine模拟Angular服务?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。