我想知道哪种方法是测试不返回任何函数(只更改一个字段值)并包含异步调用的最佳方法。
这是我要测试的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的“完成”标志。
在模拟您的服务时,使用$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。