使用mocha和chai的布尔析取(OR)

时间:2014-12-31 12:03:31

标签: javascript testing mocha karma-runner chai

我有以下场景,我必须检查URL是否正确构建,提供了一些查询参数。我不希望系统在呈现的URL中应用特定的顺序,所以我带来了以下测试用例,我希望它可以工作:

it('test that url is built correctly', function () {
    var args = {
        arg1: 'value1',
        arg1: 'value2'
    };

    var rendered_url = render_url(args);

    expect(rendered_url).to.equal('/my/url?arg1=value1&arg2=value2')
                     .or.to.equal('/my/url?arg2=value2&arg1=value1')
    ;
});

我很惊讶or链不存在,因为它使语句构建过程整洁和舒适。

我知道我可以通过多种方式解决这个问题(例如,使用satisfy),但我想知道:

  • 我是否找不到与文档中我想要的类似方式实现的模式(我已经仔细阅读过了)......
  • ......或者是否有充分理由不在Chai中包含这种结构......
  • ...或是否存在一种替代方法来实现类似于示例中的构造(调整,其他框架等)

2 个答案:

答案 0 :(得分:5)

您可以使用to.include.match

var chai = require("chai");
var expect = chai.expect;

var option1 = '/my/url?arg1=value1&arg2=value2';
var option2 = '/my/url?arg2=value2&arg1=value1';

var possible = [option1, option2];

var re = /^\/my\/url\?arg1=value1&arg2=value2|\/my\/url\?arg2=value2&arg1=value1$/;

it('1', function () {
    var rendered_url = option1;
    expect(possible).to.include(rendered_url);
    expect(rendered_url).to.match(re);
});

it('2', function () {
    var rendered_url = option2;
    expect(possible).to.include(rendered_url);
    expect(rendered_url).to.match(re);
});

it('3', function () {
    var rendered_url = "foo";
    expect(possible).to.include(rendered_url);
});

it('4', function () {
    var rendered_url = "foo";
    expect(rendered_url).to.match(re);
});

前2个测试将通过,最后2个测试将失败。

我在这个例子中没有这样做,但possiblere都可以由函数生成,而不是手工编码所有可能的参数排列。

我怀疑.or不在Chai中的原因是它会使Chai的代码变得相当复杂,并且使得常规案例的使用变得更加麻烦。现在,当调用.equal时,它知道它是终端。如果Chai允许使用.or,则.equal无法立即知道它是否是终端。即使您有expect(foo).to.equal(bar)之类的内容,对equal的调用也无法知道它是终端。你必须做一些像承诺库所做的事情来表示代码完成了一个承诺,并打电话说“我在这里完成”所以它看起来像expect(foo).to.equal(bar).end()。我不是说它不会不可能但它会产生广泛的影响。

答案 1 :(得分:2)

您可以执行以下操作:

expect(rendrered_url).to.satisfy(function(url){
    return url === '/my/url?arg1=value1&arg2=value2 || url === '/my/url?arg2=value2&arg1=value1';
});