需要一些关于BDD如何简单的url解析器函数的建议

时间:2014-05-23 06:12:10

标签: javascript tdd jasmine bdd

我正在使用jasmine练习BDD,这个函数将http查询字符串转换为对象。

'a=b&c=d'   ->   {a: 'b', c: 'd'}

我能想出的就是:

describe('queryParser', function() {
    it('should return query object', function() {
        expect(parseUrl('a=b')).toEqual({
            a: 'b'
        });

        expect(parseUrl('a=b&c=d')).toEqual({
            a: 'b',
            c: 'd'
        });

        expect(parseUrl('&a=b&c=d')).toEqual({
            a: 'b',
            c: 'd'
        });

        expect(parseUrl('a=&c=d')).toEqual({
            a: '',
            c: 'd'
        });

        expect(parseUrl('')).toEqual({});
    });
});

但我认为在一个测试用例中有太多断言(期望)。如果我正在写tdd,我可以将断言分成

testOneNameValuePair
testMultipleNameValuePairs
testNoNameValuePair

但是对于BDD,我可以像should handle one name value pair case那样写吗?这听起来微不足道。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

这真的是一种风格问题(因此意见,所以它可能不属于这里......)但我会写一些类似的东西:

it("should be an empty object when the query is empty", function() {
  expect( parseUrl('') ).toEqual( {} );
});

it("should separate names from values with = sign"),  function() {
  expect( parseUrl('a=b') ).toEqual( { a: 'b' } );
});

it("should separate multiple pairs with & sign"),  function() {
  expect( parseUrl('a=b&c=d') ).toEqual( { a: 'b', c: 'd' } );
});

it("should ignore a leading & sign"),  function() {
  expect( parseUrl('&a=b&c=d') ).toEqual( { a: 'b', c: 'd' } );
});

it("should use empty string when a value is missing"),  function() {
  expect( parseUrl('a=') ).toEqual( { a: '' } );
});

我在这里要做的就是确保我的规范名称不仅描述了条件,而且还指出了我希望代码在这些条件下做的事情。

我对你写的实际断言只做了几处小改动。我把空字符串放在第一位,因为我经常使用它作为我的第一个测试。此外,在缺失值的情况下,我停止了第二对。我认为这与被测试的内容无关,而将其删除会使测试更容易阅读。不过,这些都是风格和个人品味的问题。

TL; DR:编写对您和您的同事有用的规范名称。没有其他人的意见很重要。