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

aja*_*est 4 javascript testing mocha.js chai karma-runner

我有以下情况,我必须检查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')
    ;
});
Run Code Online (Sandbox Code Playgroud)

我很惊讶or链条不存在,因为它使声明构建过程整洁和舒适.

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

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

Lou*_*uis 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);
});
Run Code Online (Sandbox Code Playgroud)

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

我没有在这个例子做了但两者possiblere可以通过函数生成的,而不是手工编码的参数所有可能的排列.

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