Angularjs 如何在无后端应用程序中使用单元测试?
我用一个单元测试创建了一个没有后端的应用程序,该测试是一个http get调用,我的问题是当我删除主应用程序中的Angularjs 如何在无后端应用程序中使用单元测试?,angularjs,unit-testing,mocking,Angularjs,Unit Testing,Mocking,我用一个单元测试创建了一个没有后端的应用程序,该测试是一个http get调用,我的问题是当我删除主应用程序中的ngMockE2E模块和app.run()中的伪后端http get处理程序时,一切正常,但当在app.run()中添加addngMockE2E和伪后端http get处理程序时然后运行测试此错误将出现: Error: No pending request to flush ! createHttpBackendMock/$httpBackend.flush@C:/app-se
ngMockE2E
模块和app.run()中的伪后端http get处理程序时,一切正常,但当在app.run()中添加addngMockE2E
和伪后端http get处理程序时然后运行测试此错误将出现:
Error: No pending request to flush !
createHttpBackendMock/$httpBackend.flush@C:/app-server-ui/libs/angular/angular-mocks/angular-mocks.js:1779:1
@C:/app-server-ui/test/signin.controller.test.js:35:7
invoke@C:/app-server-ui/libs/angular/angular/angular.js:4523:14
workFn@C:/app-server-ui/libs/angular/angular-mocks/angular-mocks.js:2810:11
angular.mock.inject@C:/app-server-ui/libs/angular/angular-mocks/angular-mocks.js:2778:25
@C:/app-server-ui/test/signin.controller.test.js:17:35
@C:/app-server-ui/test/signin.controller.test.js:16:3
@C:/app-server-ui/test/signin.controller.test.js:4:1
我的测试文件是:
describe("SigninCtrl", function () {
var $httpBackend, $controller, $rootScope, createController, authRequestHandler;
beforeEach(module("app"));
beforeEach(inject(function ($injector) {
$controller = $injector.get("$controller");
$httpBackend = $injector.get("$httpBackend");
authRequestHandler = $httpBackend.when("GET", "/signin")
.respond({username: "admin", password: "admin"});
}));
describe("auth user", function () {
it("user pass must be admin", inject(function ($http) {
var $scope = {};
/* Code Under Test */
var controller = $controller("SigninCtrl", {$scope: $scope});
/* End */
$http.get("/signin.py")
.success(function (data) {
$scope.user = data.user;
});
$httpBackend.whenGET('/signin.py').respond({
"user": {
"username": "admin",
"password": "admin"
}
});
$httpBackend.flush();
expect($scope.user).toEqual({username: "admin", password: "admin"});
}));
})
});
我的应用程序运行功能是:
angular
.module('app')
.run(runBlock)
.config(config);
runBlock.$inject = ['$rootScope', '$state', '$stateParams', '$httpBackend'];
function runBlock($rootScope, $state, $stateParams, $httpBackend) {
$rootScope.$state = $state;
$rootScope.$stateParams = $stateParams;
$httpBackend.whenGET(/(\.html|\.svg)/).passThrough();
$httpBackend.whenGET('/signin.py').respond({
"user": {
"username": "admin",
"password": "admin"
}
})
}
我不明白您为什么在生产代码中使用
$httpBackend
。这只是为了测试。为什么要在测试中执行http请求?难道应用程序本身不应该触发那个呼叫吗?基本流程是:1。在测试中使用$httpBackend
设置http调用的期望值。2.注入触发http调用的(例如)控制器。3.触发触发http调用的方法。4. $httpBackend
现在将检查期望值是否与触发的http请求相同首先是,最好使用$httpBackend
开发,而不是生产。其次,为了简单起见,我在测试中使用http请求,还有一个问题是,为什么测试中的模拟和应用中的模拟相互冲突?