在测试之外使用断言库进行列表操作

时间:2015-09-04 15:35:46

标签: javascript functional-programming

在我目前的项目中,我在前端做了很多列表操作,并且我意识到使用像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.firstNameperson.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。它可以有任何不同,只要我可以用它来。

1 个答案:

答案 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