[英]Angular 1.x service injection in unit tests
I've been trying different variations based on the info that's out there, but haven't got to a working solution yet.我一直在根据现有信息尝试不同的变体,但还没有找到可行的解决方案。
I'm trying to inject a service into a unit test for testing.我正在尝试将服务注入单元测试进行测试。
My current implementation is below.我目前的实现如下。 The issue is, the service isn't: ReferenceError: Can't find variable: SerializationService
- I've tried using inject()
in the beforeeach too to no avail.问题是,该服务不是: ReferenceError: Can't find variable: SerializationService
- 我也试过在 beforeeach 中使用inject()
也无济于事。
spec.js规范.js
'use strict';
describe('SerializationService', function () {
var SerializationService;
beforeEach(function () {
module('app');
inject(function (_SerializationService_) {
SerializationService = _SerializationService_;
});
});
it('should have a SerializationService', function () {
expect(SerializationService).toBeDefined();
});
});
Other things I've tried:我尝试过的其他事情:
karma.conf业力配置文件
// Karma configuration
// http://karma-runner.github.io/0.12/config/configuration-file.html
// Generated on 2016-08-15 using
// generator-karma 0.8.3
module.exports = function (config) {
'use strict';
config.set({
// enable / disable watching file and executing tests whenever any file changes
autoWatch: true,
// base path, that will be used to resolve files and exclude
basePath: '../../',
// testing framework to use (jasmine/mocha/qunit/...)
frameworks: ['jasmine'],
// list of files / patterns to load in the browser
files: [
'bower_components/angular/angular.js',
'bower_components/angular-mocks/angular-mocks.js',
'bower_components/angular-animate/angular-animate.js',
'bower_components/angular-cookies/angular-cookies.js',
'bower_components/angular-resource/angular-resource.js',
'bower_components/angular-route/angular-route.js',
'bower_components/angular-sanitize/angular-sanitize.js',
'bower_components/angular-touch/angular-touch.js',
'bower_components/json3/lib/json3.js',
'bower_components/es5-shim/es5-shim.js',
'bower_components/jquery/dist/jquery.js',
'bower_components/bootstrap-sass-official/assets/javascripts/bootstrap.js',
'bower_components/angular-resource/angular-resource.js',
'bower_components/angular-cookies/angular-cookies.js',
'bower_components/angular-sanitize/angular-sanitize.js',
'bower_components/angular-animate/angular-animate.js',
'bower_components/angular-touch/angular-touch.js',
'bower_components/angular-route/angular-route.js',
'bower_components/angular-ui-router/release/angular-ui-router.js',
'bower_components/angular-audio/app/angular.audio.js',
'bower_components/socket.io.client/dist/socket.io-1.3.5.js',
'bower_components/angular-socket-io/socket.js',
'bower_components/angular-local-storage/dist/angular-local-storage.js',
'bower_components/moment/moment.js',
'bower_components/angular-moment/angular-moment.js',
'bower_components/angular-scroll-glue/src/scrollglue.js',
'bower_components/angular-gravatar/build/angular-gravatar.js',
'bower_components/angular-socialshare/dist/angular-socialshare.min.js',
'bower_components/clipboard/dist/clipboard.js',
'bower_components/ngclipboard/dist/ngclipboard.js',
'bower_components/color-thief/src/color-thief.js',
'bower_components/ngColorThief/angular-colorthief.js',
'bower_components/hashids/dist/hashids.js',
'bower_components/ngEmbed/src/ng-embed.js',
'bower_components/angular-bootstrap/ui-bootstrap-tpls.js',
'bower_components/ngEmbed/src/ng-embed.js',
'app/scripts/**/*.js',
'test/unit/mock/**/*.js',
'test/unit/spec/**/*.js'
],
// list of files / patterns to exclude
exclude: [],
// web server port
port: 8081,
// Start these browsers, currently available:
// - Chrome
// - ChromeCanary
// - Firefox
// - Opera
// - Safari (only Mac)
// - PhantomJS
// - IE (only Windows)
browsers: [
'PhantomJS'
],
// Which plugins to enable
plugins: [
'karma-phantomjs-launcher',
'karma-jasmine'
],
// Continuous Integration mode
// if true, it capture browsers, run tests and exit
singleRun: false,
colors: true,
// level of logging
// possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
logLevel: config.LOG_INFO
//// Uncomment the following lines if you are using grunt's server to run the tests
// proxies: {
// '/': 'http://localhost:9000/'
// },
// //URL root prevent conflicts with the site root
// urlRoot: '_karma_'
});
};
I've created a little sample on plunker: Plunker example我在 plunker 上创建了一个小示例: Plunker example
It uses angular-mocks and jasmine for testing.它使用 angular-mocks 和 jasmine 进行测试。 The main part:主要部分:
describe('TestService', function(){
beforeEach(module('test'));
var TestService;
beforeEach(inject(function(_TestService_) {
TestService = _TestService_;
}));
it('returns 42', function(){
expect(TestService.testMethod()).toEqual(42);
});
});
You have to use inject
, which is defined in angular-mocks.您必须使用在 angular-mocks 中定义的inject
。 It injects services, controllers, etc. The underscores are automatically stripped, it is only syntactic sugar to be able to name your variable as TestService
它注入服务、控制器等。下划线会自动去除,能够将变量命名为TestService
只是语法糖
Issue was in my mocking modules问题出在我的模拟模块中
I was using the crate method instead of the get:我使用的是 crate 方法而不是 get:
This is wrong:这是错误的:
angular
.module('meow-mock', [])
.factory('somemock', function () {
//code
});
This is right:这是对的:
angular
.module('meow-mock')
.factory('somemock', function () {
//code
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.