当前位置: 首页 > 知识库问答 >
问题:

Jasmine:测试包含异步调用的无效函数

毕富
2023-03-14

我想知道哪种方法是测试不返回任何函数(只更改一个字段值)并包含异步调用的最佳方法。

这是我要测试的AngularJS控制器,我调用的服务返回一个promise(总是返回{name:"John"}):

app.controller('MyCtrl', function($scope, AsyncService) {

  $scope.greeting = "";
  $scope.error = 

  $scope.sayHello = function() {

    AsyncService.getName().then(
        function(data){
            $scope.saludo = "Hello " + data.name;
        },
        function(data){
              $scope.error = data;
        }
    );

  };

});

如果sayHello函数不包含异步调用,这将是规范,但它总是失败,因为scope.greeting总是空的。

describe('Test My Controller', function() {

  var scope, $httpBackend;

  // Load the module with MainController
  //mock Application to allow us to inject our own dependencies
  beforeEach(angular.mock.module('app'));

  //mock the controller for the same reason and include $rootScope and $controller
  beforeEach(angular.mock.inject(function($rootScope, $controller,_$httpBackend_){

      //Mock the service to always return "John" 
      $httpBackend = _$httpBackend_;
      $httpBackend.when('POST', 'http://localhost:8080/greeting').respond({name: "John"});

      //create an empty scope
      scope = $rootScope.$new();
      //declare the controller and inject our empty scope
      $controller('MyCtrl', {$scope: scope});
  }));

  it('$scope.greeting should get filled after sayHello', function() {
    expect(scope.greeting).toEqual("");
    scope.sayHello();
    expect(scope.greeting).toEqual("Hello John");
  });*/

});

我将如何使用此规范来处理异步调用?我真的不明白如何以及在哪里使用Jasmine 2.0的“完成”标志。

共有1个答案

柳坚白
2023-03-14

在模拟您的服务时,使用$q.defer()从getName函数返回promise。然后,在创建控制器时,将模拟数据传递到依赖项中:

beforeEach(inject(function($controller, _$rootScope_, $q) {
    $rootScope = _$rootScope_;
    deferred = $q.defer();

    asyncService = {
        getName: function () {
        }
    };

    spyOn(asyncService, 'getName').and.returnValue(deferred.promise);

    $scope = $rootScope.$new(); 

    createController = function() {
        return $controller('MyCtrl', { $scope: $scope, AsyncService: asyncService } );
    };
}));

然后在调用$scope.hello()调用deferred.resolve(data)l之后,其中data是您希望从promise中的服务返回的数据。然后调用$rootScope.$digest()

it('$scope.saludo should get filled after sayHello', function() {
    //Arrange
    var controller = createController();
    var data = {
      name: 'John'
    };

    //Act
    $scope.sayHello();
    deferred.resolve(data);
    $rootScope.$digest();

    //Assert
    expect($scope.saludo).toEqual('Hello ' + data.name);
});

普朗克尔

 类似资料:
  • 我正在尝试用Jasmine和RequireJS做一些测试。一切都进行得很好,直到我注意到我所描述的函数的上下文出现了问题。 有人知道怎么解决这个吗?

  • 全部: 我对Jasmine测试非常陌生,我想知道的一个关于异步测试的问题是: 有谁能简单解释一下Jasmine是如何知道里面有一个done()函数调用并等待它完成的? 例如,如果我把一些异步调用在之前: Jasmine怎么知道它应该让规范测试等待? 谢谢

  • 我试图为我编写的一些代码编写单元测试,遇到的问题是我希望在执行函数后调用模拟回调,但我的测试失败,因为它从未被调用。 正在测试的功能非常简单: 我怀疑的问题是,由于请求的异步性质,jasmine在API调用中执行模拟回调之前测试期望值。我尝试过使用其他人建议使用的done()和flags,但没有成功。希望能在这方面提供一些指导。

  • jasmine:在jasmine指定的超时内没有调用异步回调。DEFAULT_TIMEOUT_INTERVAL 测试window.post消息指令 用Jasmine async测试postMessage不起作用 我有下面的代码,我正在接收下面的输出。 在jasmine.DEFAULT\u timeout\u INTERVAL指定的超时内未调用异步回调 myService在父描述函数中定义。正如我所

  • 问题内容: 基于此答案,我想在一个将从另一个文件导入的类中构建一个异步websoket客户端: 然后将其导入中,其中包含以下内容: 但是它检索到以下错误: 这是怎么回事?如果mtest.get_ticks开头是单词,为什么我不能访问它? 问题答案: 最后,我可以找到正确的方法(特别感谢 @dirn ) 这在main.py中: 这是输出: 任何改进的技巧都值得欢迎!;)

  • 我有以下问题:我试图从函数调用闭包,但是以后必须调用另一个函数。 我无法创建异步闭包,因为它们目前不稳定: 所以我得以某种方式这样做。 我发现了几个与该问题相关的问题,例如,但是当我试图实现它时,我收到了以下错误: 这里是游乐场链接,希望能显示我有什么问题。 我正在使用标题中所述的tokio。