进行练习,重新实现Jasmine测试框架中的一些功能。具体来说,我正在运行这一行:
expect(false).not.toBe(true)
我得到一个TypeError,说toBe不作为函数存在。但是,这一行:
expect(true).toBe(true)
通过。我怀疑这是我的not()函数返回此问题。
function ExpectedValue (val) {
this.value = val;
this.notted = false;
this.not = function() {
this.notted = !this.notted;
return this;
}
this.toBe = function(b) {
if (this.notted) {
return this.value !== b;
}
else {
return this.value === b;
}
}
}
function expect(a) {
return new ExpectedValue(a);
}
console.log(expect(false).not.toBe(true));
答案 0 :(得分:1)
Jasmine' not
不是一个函数。你的是。但是你正在使用它,好像它是Jasmine的(没有()
):
console.log(expect(false).not.toBe(true));
// Note no () ---------------^
您的not
需要是一个对象,其中包含您从expect
返回的对象的所有方法,但其含义已反转,例如:
function ExpectedValue (val) {
var self = this;
self.value = val;
this.not = {
toBe: function(arg) {
return !self.toBe(arg);
}
};
this.toBe = function(b) {
return self.value === b;
};
}
function expect(a) {
return new ExpectedValue(a);
}
console.log(expect(false).not.toBe(true));

那是它的手册,但那不可扩展。相反,您拥有一个包含所有方法的对象,并通过创建反转返回的函数来创建not
。
arrayOfMethodNames.forEach(function(name) {
target.not[name] = function() {
return !target[name].apply(target, arguments);
};
});