gpt4 book ai didi

angularjs - 我应该以 Angular 模拟所有外部服务吗?

转载 作者:行者123 更新时间:2023-12-02 00:12:29 27 4
gpt4 key购买 nike

我目前正在开始进行 Angular 单元测试。由于我想要测试的第一个 Controller 看起来像这样,我感到很困惑。

angular.module('sgmPaperApp')
.controller('AccountCtrl', function ($mdToast, user, $firebaseArray, Ref) {
var vm = this;
vm.data = user;
vm.save = saveUser;
vm.comments = $firebaseArray(Ref.child('comments').orderByChild('person').equalTo(user.$id));


function saveUser() {
vm.data.$save().then(function () {
$mdToast.showSimple('Data saved');
});
}
});

我真的应该模拟我使用的所有外部服务吗?毕竟该 Controller 并不比外部服务多多少,并且模拟 firebaseArray 可能很困难。

感谢您的建议并帮助我开始测试

最佳答案

您无需担心外部依赖项的作用,只需模拟它们的 API 即可。

这些是我能看到的唯一模拟。我假设您正在使用 Jasmine

var Ref, $firebaseArray, $mdToast, user, vm;

beforeEach(function() {
Ref = jasmine.createSpyObj('Ref', ['child', 'orderByChild', 'equalTo']);
Ref.child.and.returnValue(Ref);
Ref.orderByChild.and.returnValue(Ref);
Ref.equalTo.and.returnValue(Ref);

$firebaseArray = jasmine.createSpy('$firebaseArray').and.returnValue('comments');
$mdToast = jasmine.createSpyObj('$mdToast', ['showSimple']);
user = jasmine.createSpyObj('user', ['$save']);
user.$id = 'id';

module('sgmPaperApp'); // you should consider separate modules per "thing"

inject(function($controller) {
vm = $controller('AccountCtrl', {
$mdToast: $mdToast,
user: user,
$firebaseArray: $firebaseArray,
Ref: Ref
});
});
});

然后您可以轻松创建测试

it('assigns a bunch of stuff on creation', function() {
expect(vm.data).toBe(user);
expect(vm.comments).toEqual('comments'); // that's what the mock returns

expect(Ref.child).toHaveBeenCalledWith('comments');
expect(Ref.orderByChild).toHaveBeenCalledWith('person');
expect(Ref.equalTo).toHaveBeenCalledWith(user.$id);
expect($firebaseArray).toHaveBeenCalledWith(Ref);
});

您甚至可以测试基于 Promise 的方法,例如 saveUser

it('saves the user and makes some toast', inject(function($q, $rootScope) {
user.$save.and.returnValue($q.when()); // an empty, resolved promise
vm.saveUser();
expect(user.$save).toHaveBeenCalled();
expect($mdToast.showSimple).not.toHaveBeenCalled(); // because the promise hasn't resolved yet

$rootScope.$apply(); // resolves promises

expect($mdToast.showSimple).toHaveBeenCalledWith('Data saved');
}));

关于angularjs - 我应该以 Angular 模拟所有外部服务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32181201/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com