我有以下场景,我必须检查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
),但我想知道:
答案 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个测试将失败。
我在这个例子中没有这样做,但possible
和re
都可以由函数生成,而不是手工编码所有可能的参数排列。
我怀疑.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';
});