【问题标题】:Jasmine expect(resultCode).toBe(200 or 409)Jasmine 期望(resultCode).toBe(200 或 409)
【发布时间】:2014-01-23 08:20:57
【问题描述】:

对于某些测试场景,我需要针对多个值进行测试,这些值都可以。

我想做的事情如下:

expect(resultCode).toBeIn([200,409]);

resultCode200409 时,此规范应通过。这可能吗?

添加 感谢 peter 和 dolarzo 指导我创建匹配器。我遇到了 addMatchers() 的问题。所以,最后我在 jasmine.js 中添加了以下内容:

jasmine.Matchers.prototype.toBeIn = function (expected) {
    for (var i = 0; i < expected.length; i++)
        if (this.actual === expected[i])
            return true;
    return false;
};

这给了我一个可行的解决方案。我现在可以根据需要做 toBeIn。 (茉莉花1.3.1)

【问题讨论】:

标签: javascript unit-testing jasmine


【解决方案1】:

为了完成这样的工作:

 expect(3).toBeIn([6,5,3,2]);

Jasmine 有一个称为匹配器的功能:

这是一个关于如何声明它们的示例。我在最后声明了您正在寻找的方法:

describe('Calculator', function(){
    var obj;
    beforeEach(function(){
        //initialize object
        obj = new Object();

        jasmine.addMatchers({
            toBeFive: function () {
                return {
                    compare: function (actual, expected) {
                        return {
                            pass: actual === 5,
                            message: actual + ' is not exactly 5'
                        }
                    }
                };
            },
            toBeBetween: function (lower,higher) {
                return {
                    compare: function (actual, lower,higher) {
                        return {
                            pass: ( actual>= lower   && actual <= higher),
                            message: actual + ' is not between ' + lower + ' and ' + higher
                        }
                    }
                };
            },
            toBeIn: function(expected) {
                    return {
                        compare: function (actual, expected) {
                            return {
                                pass: expected.some(function(item){ return item === actual; }),
                                message: actual + ' is not in ' + expected
                            }
                        }
                    };
                }
        });


    });

这是你需要的匹配器:

toBeIn: function(expected) {
                    return {
                        compare: function (actual, expected) {
                            return {
                                pass: expected.some(function(item){ return item === actual; }),
                                message: actual + ' is not in ' + expected
                            }
                        }
                    };
                }

重要与 jasmine 2.0。我必须将 jasmine.addMatchers({ 与 jasmine specrunner.html 一起使用,但是当我使用 Karma 配置它时,我必须将 jasmine 替换为 this 之类的this.addMatchers({ 因为 Karma 使用的是早期版本的 Jasmine。

【讨论】:

  • 匹配者...感谢您的指点。我使用 jasmine.addMatcher 和 this.addMatcher 尝试了您的建议......两者都不起作用。我必须弄清楚为什么,我认为另一个问题最好,因为它涉及requirejs/typescript。同时,我确实在原型上直接在 jasmine.js 中放入了一个新的匹配器,并且可以正常工作。我用我使用的结果更新了问题。
【解决方案2】:

我们可以像这样使用expect().toContain():

expect([200,409]).toContain(resultCode);

或不包含:

expect([200,409]).not.toContain(resultCode);

【讨论】:

    猜你喜欢
    • 2020-12-19
    • 2014-04-20
    • 2012-11-11
    • 2012-05-01
    • 2014-11-06
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 2016-02-08
    相关资源
    最近更新 更多