单元测试工厂 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 呢?
另一件事是你用这个替换整个 get
和 set
函数:
myService.set = sinon.spy();
myService.get = sinon.spy();
诗乃对你原来的get
和set
一无所知。
你应该这样做:
sinon.spy(myService, 'set');
因此 sinon 可以用间谍包装您的函数,同时保留其原始行为。 Check Sinon documentation
我有一个工厂 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 呢?
另一件事是你用这个替换整个 get
和 set
函数:
myService.set = sinon.spy();
myService.get = sinon.spy();
诗乃对你原来的get
和set
一无所知。
你应该这样做:
sinon.spy(myService, 'set');
因此 sinon 可以用间谍包装您的函数,同时保留其原始行为。 Check Sinon documentation