茉莉花单元测试 Angular-Cookie

Jasmine Unit Test Angular-Cookie

我在测试 angular-cookie 模块时遇到问题。这是因为与其他方法相比,'GET' 方法的实现方式很奇怪(请注意 'GET' 方法没有方法声明):

ipCookie(cookieName)         // GET
ipCookie.remove(cookieName)  // DELETE

结果如下代码:

var ipCookie = jasmine.createSpyObj('ipCookie', ['remove'])
ipCookie.and.returnValue(true)

失败消息:

TypeError: 'undefined' is not an object (evaluating 'ipCookie.and.returnValue')

而代码:

var ipCookie = jasmine.createSpyObj('ipCookie', ['remove'])
ipCookie.remove.and.returnValue(true)

按预期工作。我究竟该如何测试这两种方法?

我还没有找到一种可以让我测试其所有方法的监视 ipCookie 的方法。为了测试 "GET" 和 "DELETE" 方法,我将我的测试套件分成 2 个,并实现了 2 种不同的监视模块的方法。

第一个测试套件允许我测试模块的方法:

describe('Service: service', function () {
  beforeEach(module('app', function ($provide) {
    $provide.value('ipCookie', jasmine.createSpyObj('ipCookie', ['remove']));
  }));

用法:expect(ipCookie.remove).toHaveBeenCalledWith('cookieName');

第二个测试套件允许我模拟模块的无名 "GET" 方法:

describe('Service: service', function () {
  beforeEach(module('app', function ($provide) {
    $provide.value('ipCookie', jasmine.createSpy('ipCookie'));
  }));

用法:ipCookie.and.returnValue(mockCookie);

基于 Cristian 的回答,我能够在一个模拟对象上同时模拟 getdelete 方法。

describe('Service: service', function() {
  var ipCookieSpy;

  beforeEach(module('app', function($provide) {
    ipCookieSpy = jasmine.createSpy('ipCookieGet');
    ipCookieSpy.remove = jasmine.createSpy('ipCookieRemove');
    $provide.value('ipCookie', ipCookieSpy);
  }));

  it('Sanity checks the ipCookie spy', inject(function(ipCookie) {
    ipCookie();
    expect(ipCookieSpy).toHaveBeenCalled();
    ipCookie.remove();
    expect(ipCookieSpy.remove).toHaveBeenCalled()
  }));
});