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

Javascript 使用mocha和chai的布尔析取(OR),javascript,testing,mocha.js,karma-runner,chai,Javascript,Testing,Mocha.js,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); e

在下面的场景中,我必须检查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')
    ;
});
我很惊讶
链不存在,因为它使语句构建过程整洁舒适

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

  • 我是否无法在文档中找到以类似方式实现我想要的模式(我已经彻底阅读了它)
  • 。。。或者是否有一个很好的理由不包括在柴的建设
  • 。。。或者是否存在实现与示例中类似的构造的替代方法(调整、其他框架等)

您可以使用
来。包括
。匹配

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项测试将失败

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


我怀疑
不在Chai中的原因是它会使Chai的代码复杂化,并使其在常规情况下使用更加麻烦。现在调用
.equal
时,它知道它是终端。如果允许Chai使用
,则
.equal
无法立即知道它是否为终端。即使您有类似于
expect(foo).to.equal(bar)
,调用
equal
也不能知道它是终端。您必须像一些Promissions库那样做,以发出代码已完成承诺的信号,并有一个调用说“我在这里完成了”,这样看起来就像
expect(foo).to.equal(bar).end()
。我并不是说这是不可能的,但它会产生广泛的影响。

你可以这样做:

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

也许我应该注意到,我更感兴趣的是如何实现易于阅读和清晰的短语结构,而不是解决URL特定问题的方法(这只是一个例子),这就是为什么我不太喜欢使用RE的原因。在我看来,对于一个测试用例来说,没有足够容易阅读的内容,我尽量避免使用它们,特别是对于这种简单的测试。然而,使用
include
是一个相对较好的方法(不是最好的)来实现我所寻找的目标,至少在测试用例中,disjuntive子句必须
等于某个东西。所问的问题有更深层次的哲学,而仅仅是断言属性的可能值。检查Chai语法中的undefined或empty如何
expect(object).to.be.undefined.or.be.empty
?是的,我还发现
success
可以用于此目的,但是我认为这种方法打破了语义链的整个阅读哲学。同意,如果你可以使用or,那就太好了。