gri*_*ett 6 cookies jasmine angularjs
在我的主要内容中,describe我有以下内容:
beforeEach(inject(function(...) {
var mockCookieService = {
_cookies: {},
get: function(key) {
return this._cookies[key];
},
put: function(key, value) {
this._cookies[key] = value;
}
}
cookieService = mockCookieService;
mainCtrl = $controller('MainCtrl', {
...
$cookieStore: cookieService
}
}
Run Code Online (Sandbox Code Playgroud)
后来我想测试一个控制器如何确认cookie是否已经存在,所以我嵌套了以下描述:
describe('If the cookie already exists', function() {
beforeEach(function() {
cookieService.put('myUUID', 'TEST');
});
it('Should do not retrieve UUID from server', function() {
expect(userService.getNewUUID).not.toHaveBeenCalled();
});
});
Run Code Online (Sandbox Code Playgroud)
但是,当我对其进行更改时,cookieService它不会持久保存到正在创建的控制器中.我采取了错误的做法吗?
谢谢!
编辑:更新了测试代码,这就是我使用$ cookieStore的方式:
var app = angular.module('MyApp', ['UserService', 'ngCookies']);
app.controller('MainCtrl', function ($scope, UserService, $cookieStore) {
var uuid = $cookieStore.get('myUUID');
if (typeof uuid == 'undefined') {
UserService.getNewUUID().$then(function(response) {
uuid = response.data.uuid;
$cookieStore.put('myUUID', uuid);
});
}
Run Code Online (Sandbox Code Playgroud)
});
您的单元测试不必创建模拟 $cookieStore 并本质上重新实现其功能。您可以使用 Jasmine 的spyOn函数来创建间谍对象并返回值。
创建存根对象
var cookieStoreStub = {};
Run Code Online (Sandbox Code Playgroud)
在创建控制器之前设置您的间谍对象
spyOn(cookieStoreStub, 'get').and.returnValue('TEST'); //Valid syntax in Jasmine 2.0+. 1.3 uses andReturnValue()
mainCtrl = $controller('MainCtrl', {
...
$cookieStore: cookieStoreStub
}
Run Code Online (Sandbox Code Playgroud)
为cookie可用的场景编写单元测试
describe('If the cookie already exists', function() {
it('Should not retrieve UUID from server', function() {
console.log(cookieStore.get('myUUID')); //Returns TEST, regardless of 'key'
expect(userService.getNewUUID).not.toHaveBeenCalled();
});
});
Run Code Online (Sandbox Code Playgroud)
注意:如果您想测试多个cookieStore.get()场景,您可能需要将控制器的创建移动到块beforeEach()内部describe()。这允许您调用spyOn()并返回适合描述块的值。