AngularJS在茉莉花测试中不考虑模拟服务



我正在尝试使用Jasmine和Karma对AngularJS服务进行单元测试。以下是我的代码的最小(混淆(表示形式:

angular.module('app', []);
angular.module('app.mock', []);
var MyHelper = function(pollHelper) {
var poller = pollHelper.getInstance();
};
var PollHelper = function() {
var service = this;
service.getInstance = function() {}
};
angular.module('app')
.service('myHelper', MyHelper)
.service('pollHelper', PollHelper);
angular.module('app.mock')
.service('pollHelperMock', function() {
var methods = ['getInstance'],
pollHelper = jasmine.createSpyObj('pollHelperMock', methods);
return pollHelper;
});
describe('MyHelper', function() {
var pollHelper, myHelper, $rootScope;
pollHelper = jasmine.createSpy('pollHelper');
beforeEach(module('app.mock'));
beforeEach(module('app', function($provide) {
console.log('prints 1'); // Prints on console
$provide.service('pollHelper', function() {
return pollHelper;
});
}));
beforeEach(
inject(
function(_pollHelperMock_, _myHelper_, _$rootScope_) {
console.log('prints 2'); // Doesn't print anything
pollHelper.and.callFake(_pollHelperMock_);
angular.extend(pollHelper, _pollHelperMock_);
myHelper = _myHelper_;
$rootScope = _$rootScope_;
}));
describe('Initialization', function() {
it('Gets poller instance', function() {
$rootScope.$apply();
});
});
});
/// Code for Jasmine test executor
(function() {
var env = jasmine.getEnv();
env.addReporter(new jasmine.HtmlReporter());
env.execute();
}());
#HTMLReporter #jasmine_content,#TrivialReporter #jasmine_content{position:fixed;right:100%}body{background-color:#eee;padding:0;margin:5px;overflow-y:scroll}#HTMLReporter{font-size:11px;font-family:Monaco,"Lucida Console",monospace;line-height:14px;color:#333}#HTMLReporter a{text-decoration:none}#HTMLReporter a:hover{text-decoration:underline}#HTMLReporter h1,#HTMLReporter h2,#HTMLReporter h3,#HTMLReporter h4,#HTMLReporter h5,#HTMLReporter h6,#HTMLReporter p{margin:0;line-height:14px}#HTMLReporter .alert .bar,#HTMLReporter .banner,#HTMLReporter .resultMessage,#HTMLReporter .specDetail .description,#HTMLReporter .stackTrace,#HTMLReporter .summary,#HTMLReporter .symbolSummary{padding-left:9px;padding-right:9px}#HTMLReporter .version{color:#aaa}#HTMLReporter .banner{margin-top:14px}#HTMLReporter .duration{color:#aaa;float:right}#HTMLReporter .symbolSummary{overflow:hidden;margin:14px 0}#HTMLReporter .symbolSummary li{display:block;float:left;height:7px;width:14px;margin-bottom:7px;font-size:16px}#HTMLReporter .symbolSummary li.passed,#HTMLReporter .symbolSummary li.skipped{font-size:14px}#HTMLReporter .symbolSummary li.passed:before{color:#5e7d00;content:"2022"}#HTMLReporter .symbolSummary li.failed{line-height:9px}#HTMLReporter .symbolSummary li.failed:before{color:#b03911;content:"x";font-weight:700;margin-left:-1px}#HTMLReporter .symbolSummary li.skipped:before{color:#bababa;content:"2022"}#HTMLReporter .symbolSummary li.pending{line-height:11px}#HTMLReporter .symbolSummary li.pending:before{color:#aaa;content:"-"}#HTMLReporter .exceptions{color:#fff;float:right;margin-top:5px;margin-right:5px}#HTMLReporter .results,#HTMLReporter .summary{margin-top:14px}#HTMLReporter .bar{line-height:28px;font-size:14px;display:block;color:#eee}#HTMLReporter #details,#HTMLReporter.showDetails .summary{display:none}#HTMLReporter .runningAlert{background-color:#666}#HTMLReporter .skippedAlert{background-color:#aaa}#HTMLReporter .skippedAlert:first-child{background-color:#333}#HTMLReporter .skippedAlert:hover{color:#fff;text-decoration:underline}#HTMLReporter .passingAlert{background-color:#a6b779}#HTMLReporter .passingAlert:first-child{background-color:#5e7d00}#HTMLReporter .failingAlert{background-color:#cf867e}#HTMLReporter .failingAlert:first-child{background-color:#b03911}#HTMLReporter .resultsMenu,#HTMLReporter .resultsMenu a{background-color:#fff;color:#333}#HTMLReporter.showDetails .summaryMenuItem{font-weight:400;text-decoration:inherit}#HTMLReporter .summaryMenuItem,#HTMLReporter.showDetails .detailsMenuItem{font-weight:700;text-decoration:underline}#HTMLReporter.showDetails .summaryMenuItem:hover{text-decoration:underline}#HTMLReporter .resultMessage span.result,#HTMLReporter.showDetails #details{display:block}#HTMLReporter .summary .specSummary,#HTMLReporter .summary .suite .suite{margin-left:14px}#HTMLReporter .summary .specSummary.passed a{color:#5e7d00}#HTMLReporter .summary .specSummary.failed a{color:#b03911}#HTMLReporter .description+.suite{margin-top:0}#HTMLReporter .suite{margin-top:14px}#HTMLReporter .suite a{color:#333}#HTMLReporter #details .specDetail{margin-bottom:28px}#HTMLReporter #details .specDetail .description{display:block;color:#fff;background-color:#b03911}#HTMLReporter .resultMessage{padding-top:14px;color:#333}#HTMLReporter .stackTrace{margin:5px 0 0;max-height:224px;overflow:auto;line-height:18px;color:#666;border:1px solid #ddd;background:#fff;white-space:pre}#TrivialReporter{padding:8px 13px;position:absolute;top:0;bottom:0;left:0;right:0;overflow-y:scroll;background-color:#fff;font-family:"Helvetica Neue Light","Lucida Grande",Calibri,Arial,sans-serif}#TrivialReporter a,#TrivialReporter a:visited{color:#303}#TrivialReporter a:active,#TrivialReporter a:hover{color:#00f}#TrivialReporter .run_spec{float:right;padding-right:5px;font-size:.8em;text-decoration:none}#TrivialReporter .banner{color:#303;background-color:#fef;padding:5px}#TrivialReporter .logo{float:left;font-size:1.1em;padding-left:5px}#TrivialReporter .logo .version{font-size:.6em;padding-left:1em}#TrivialReporter .runner.running{background-color:#ff0}#TrivialReporter .options{text-align:right;font-size:.8em}#TrivialReporter .suite{border:1px outset gray;margin:5px 0;padding-left:1em}#TrivialReporter .suite .suite{margin:5px}#TrivialReporter .suite.passed{background-color:#dfd}#TrivialReporter .suite.failed{background-color:#fdd}#TrivialReporter .spec{margin:5px;padding-left:1em;clear:both}#TrivialReporter .spec.failed,#TrivialReporter .spec.passed,#TrivialReporter .spec.skipped{padding-bottom:5px;border:1px solid gray}#TrivialReporter .spec.failed{background-color:#fbb;border-color:red}#TrivialReporter .spec.passed{background-color:#bfb;border-color:green}#TrivialReporter .spec.skipped{background-color:#bbb}#TrivialReporter .messages{border-left:1px dashed gray;padding-left:1em;padding-right:1em}#TrivialReporter .passed{background-color:#cfc;display:none}#TrivialReporter .failed{background-color:#fbb}#TrivialReporter .skipped{color:#777;background-color:#eee;display:none}#TrivialReporter .resultMessage span.result{display:block;line-height:2em;color:#000}#TrivialReporter .resultMessage .mismatch{color:#000}#TrivialReporter .stackTrace{white-space:pre;font-size:.8em;margin-left:10px;max-height:5em;overflow:auto;border:1px inset red;padding:1em;background:#eef}#TrivialReporter .finished-at{padding-left:1em;font-size:.6em}#TrivialReporter.show-passed .passed,#TrivialReporter.show-skipped .skipped{display:block}#TrivialReporter .runner{border:1px solid gray;display:block;margin:5px 0;padding:2px 0 2px 10px}
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js"></script>
<script src="https://cdn.jsdelivr.net/jasmine/1.3.1/jasmine.js"></script>
<script src="https://cdn.jsdelivr.net/jasmine/1.3.1/jasmine-html.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular-mocks.js"></script>

问题是,一旦我尝试执行my-helper.spec.js,它就会抛出一个错误,本质上是:

TypeError: pollHelper.getInstance is not a function

此外,只打印第一个console.log语句,而不是第二个语句,这给人的印象是根本没有调用inject函数。

如何测试服务,一旦模块初始化,就会调用getInstance()

感谢您的帮助。

我们要测试:

angular.module('app', []);
var MyHelper = function(pollHelper) {
var poller = pollHelper.getInstance();
console.log('in my helper:' + poller);
};
var PollHelper = function() {
var service = this;
service.name = 'original helper';
service.getInstance = function() { return 'original helper instance'}
};
angular.module('app')
.service('myHelper', MyHelper)
.service('pollHelper', PollHelper);

在测试中:

const pollHelperMock = {
name: 'mock helper',
getInstance: function() { return 'mock helper result'; }
}
beforeEach(module('app', function($provide) {
$provide.service('pollHelper', function() {
return pollHelperMock;
});
}));
beforeEach(inject(function(pollHelper, myHelper) {
console.log(pollHelper.name);
console.log(pollHelper.getInstance());
}))

输出:

in my helper:mock helper result
mock helper
mock helper result

相关内容

最新更新