【问题标题】:How to write a custom matcher for jasmine to find if the object properties lie within a range of object property values?如何为 jasmine 编写自定义匹配器以查找对象属性是否位于对象属性值范围内?
【发布时间】:2018-04-11 20:39:16
【问题描述】:

我正在尝试为 Jasmine 实现一个自定义匹配器,我想检查给定的对象属性值是否在其他两个对象属性值的范围内。

这是我目前得到的:

let matcher = {
            toLieWithin: function (util: jasmine.MatchersUtil, customEqualityTesters: Array<jasmine.CustomEqualityTester>): jasmine.CustomMatcher {
                return {
                    compare: function (actual: any, expected: any): jasmine.CustomMatcherResult {
                        let result: jasmine.CustomMatcherResult = {
                            pass: false,
                            message: ''
                        };

                        result.pass = liesWithin(actual, expected);

                        return result;
                    }
                }
            }
        }; 

function liesWithin<T>(objActual: T, objExpected: T[]): boolean {
        let output: boolean;
        if(objExpected) {
          output = objActual.x > objExpected[0].x && objActual.x < objExpected[1].x && objActual.y > objExpected[0].y && objExpected[1].y;
        }
return output;    
}

在这里,我假设实际有两个属性xy。并且预期是两个对象的数组,它们也有两个属性,每个 xy

actual = {x: -5, y: -10}; expected = [{x: -10, y: -17},{x: 0, y: 0}];

现在,我相信对于上面给出的简单示例,这种情况是可行的。但是当我试图将它实现为泛型时,我如何找到该对象具有哪些属性?我的方法正确吗?谁能给我一些想法,我该如何实现这样的方法。

谢谢。

【问题讨论】:

    标签: javascript typescript jasmine jasmine-matchers


    【解决方案1】:

    看起来您的liesWithin 函数走在正确的轨道上,您只需要考虑expected 对象可能不会按您期望的顺序返回的情况。这段代码也应该涵盖这些情况:

    // Helper to reduce repeated code
    function isWithinRange(val, a, b) {
        return (val > a && val < b) || (val > b && val < a);
    }
    
    function liesWithin<T>(objActual: T, objExpected: T[]): boolean {
        if (objExpected) {
            let props = Object.keys(objActual);
            // Splitting X and Y checks into two for readability
            let isInYRange = isWithinRange( objActual[ props[0] ], objExpected[0][ props[0] ], objExpected[1][ props[0] ] );
            let isInXRange = isWithinRange( objActual[ props[1] ], objExpected[0][ props[1] ], objExpected[1][ props[1] ] );
            return isInXRange && isInYRange;
        }
        return;
    }
    

    【讨论】:

    • 甜蜜。但是如果xy 不是对象的属性,它们是ab 怎么办。我如何一般地实现它而不依赖在这种情况下实现的硬编码属性?
    • 我刚刚编辑了我的答案以解决这种情况。您可以使用 Object.keys 来获取对象中的属性名称数组,但这假设 objExpected 中只有两个键。
    • 非常感谢您的精彩回答 :)
    猜你喜欢
    • 2018-03-03
    • 2022-08-08
    • 1970-01-01
    • 2018-02-16
    • 2020-06-20
    • 2012-05-24
    • 2012-02-22
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多