在我目前的项目中,我在前端做了很多列表操作,并且我意识到使用像chai或其他断言库这样的东西可以节省我很多时间并使代码具有可读性。
虽然Chaijs虽然很酷,但是它的api并不完全正常,而且很友好。我的问题是:
寻找断言库以便在测试环境之外使用以进行数组操作/过滤实际上是个好主意。还是我抽烟了?
如果是的话,任何一个人都有成功的故事吗?
我尝试做的一些简化示例:
const people = [
{name: "David Smith", age: 25, livedIn: ["London", "Paris"]},
{name: "John Smith", age: 30, livedIn: ["New York"]},
{name: "John Gates", age 25, livedIn: ["London", "New York"]}
]
目前我们使用普通封口,当支票很容易时,它们都很好而且有光泽:
people
// Let's find 25 year olds
.filter((person) => person.age === 25);
// And see who is among them john
.filter((person) => person.name.indexOf("John") === 0);
现在这一切都很简单明了,但是我们需要开始测试深层属性:person.names.firstName
或person.cities[<index>].postCode
这就是断言库在纸张,柴或茉莉上做得很好的东西有方法可以做到这一点,例如来自chaijs文档:
expect(tea).to.have.property('flavors').with.length(3);
例如,使用断言库,我可以找到住在伦敦的人:
people
.filter((person) => {
return expect(person.livedIn).to.includes("London");
});
或不住在伦敦:
people
.filter((person) => {
return expect(person.livedIn).not.to.includes("London");
});
当然也有范围:
expect({price: 50}).to.be.within(40, 60);
现在虽然chaijs和jasmine都做了我需要的功能,但是他们的API不起作用,我希望api接近Ramda或者说是Composable函数,首先是规则,迭代最后。有点像:
people
.filter(within('age', 20, 40)) // Filter age property, to be 20 < age < 40
.filter(contains('livedIn', 'London', 'Boston')) // Further filter people, by place they lived in.
我当然不想要或者不需要那个API。它可以有任何不同,只要我可以用它来。
答案 0 :(得分:2)
为此,我绝对不会在您的实时代码中包含断言库。像Lodash这样的库有一些你可以使用的有用功能:
people
.filter(p => _.inRange(p.age, 20, 40))
.filter(p => _.intersection(['London', 'Boston'], p.livedIn).length > 0)
这可能不是您想要的语法。然而,功能编程的好处在于,编写一些自己的函数来生成您正在寻找的过滤器非常容易。
filters = {
within: (property, low, high) => {
return (obj) => {
return obj[property] >= low && obj[property] <= high;
};
},
...
};
people
.filter(filters.within('age', 20, 40)) // Filter age property, to be 20 < age < 40