单元测试工厂 Jasmine-Sinon

Unit Testing Factories Jasmine-Sinon

我有一个工厂 getter 和 setter

.factory('myService', function() {
  var car = null;
  return {
    car: car,
    get: function get() {
      return car;
    },
    set: function set(newCar) {
      car = newCar;
    }
  };
});

我正在为其编写测试,但我无法调用 set 方法并将其实际设置为 car newCar

myService.set = sinon.spy();
myService.get = sinon.spy()

it('should set car to new car', function () {
  var newCar = ['a','b','c'];
  expect(myService.car).toEqual(null); //pass

  myService.set(newCar);

  dump(myService.car); //null

  expect(myService.set).toHaveBeenCalledWith(newCar);//pass

  expect(myService.get).toHaveReturned(newCar);//fail

});

关于我在这里做错了什么有什么建议吗?

这里问题比较多

一个是 .car 属性 将始终为 null。

var car = null;
return {
  car: car,
  get: function get() {
    return car;
  },
  set: function set(newCar) {
    car = newCar;
  }
};

在这里你用 car 初始化它,它是空的。他们之间不会有参考。这将始终为空,因为您永远不会更改对象上的 属性:

dump(myService.car); //null

你可以这样做:

return {
  car: null,
  get: function get() {
    return this.car;
  },
  set: function set(newCar) {
    this.car = newCar;
  }
};

但是有了这个,您以后可能 运行 会遇到一些 this 上下文问题。为什么要公开 car 如果你有 getter 呢?

另一件事是你用这个替换整个 getset 函数:

myService.set = sinon.spy();
myService.get = sinon.spy();

诗乃对你原来的getset一无所知。

你应该这样做: sinon.spy(myService, 'set');

因此 sinon 可以用间谍包装您的函数,同时保留其原始行为。 Check Sinon documentation