【问题标题】:Unit Testing Factories Jasmine-Sinon单元测试工厂 Jasmine-Sinon
【发布时间】:2016-01-12 16:05:53
【问题描述】:

我有一个带有 getter 和 setter 的工厂

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

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

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

});

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

【问题讨论】:

    标签: javascript angularjs jasmine sinon


    【解决方案1】:

    这里还有更多问题。

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

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

    在这里,您使用为空的car 对其进行初始化。他们之间不会有任何参照。这将始终为 null,因为您永远不会更改对象上的该属性:

    dump(myService.car); //null
    

    你可能会这样做:

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

    但是这样你以后可能会遇到一些this 上下文问题。如果你有一个吸气剂,你为什么要公开car

    另一件事是您将整个 getset 函数替换为:

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

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

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

    所以 sinon 可以用间谍包装你的函数,同时保留它的原始行为。 Check Sinon documentation

    【讨论】:

    • 谢谢!我没有正确设置我的间谍,没有意识到断开连接。
    猜你喜欢
    • 2017-10-07
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    相关资源
    最近更新 更多