改进Jasmine测试输出以进行阵列比较

时间:2014-09-02 10:57:05

标签: javascript unit-testing jasmine

我想替换这个测试代码:

expect(events.length).toEqual(2);

expect(events[0].item).toEqual("A");
expect(events[0].newIndex).toEqual(0);
expect(events[0].type).toEqual(CollectionChangeType.Insert);

expect(events[1].item).toEqual("D");
expect(events[1].oldIndex).toEqual(2);
expect(events[1].type).toEqual(CollectionChangeType.Remove);

......用较短的形式(在我的情况下实际上更彻底)......

expect(events).toEqual([
    CollectionChange.insert("A", "A", 0),
    CollectionChange.remove("D", "D", 2)
]);

然而,出现错误时输出太难以阅读。

  

预期[{type:0,item:'A',itemId:'A',newIndex:0,oldIndex:-1},{type:2,item:'D',itemId:'D',newIndex :-1,oldIndex:3}]等于[{type:0,item:'A',itemId:'A',newIndex:0,oldIndex:-1},{type:2,item:'D', itemId:'D',newIndex:-1,oldIndex:2}]。

有没有办法自定义此输出?例如,我很高兴:

Array items differ at indices:

[1] expected { type: 2, item: 'D', itemId: 'D', newIndex: -1, oldIndex: 3 }
    but saw  { type: 2, item: 'D', itemId: 'D', newIndex: -1, oldIndex: 2 }

我可以在进行数组比较的情况下修改逻辑吗?

2 个答案:

答案 0 :(得分:1)

您可以创建自己的茉莉花匹配器,其中包含更详细的消息。 See this link for details

我在jasmine 1.3中制作了一个简单的版本,可以帮助你入门。

describe("example", function ()
{
    beforeEach(function ()
    {
        this.addMatchers({

            arrayComparison: function (expected)
            {
                var actual = this.actual;
                this.message = function() { return "Array items differ at indices:\n\n[1] expected " + expected + "\n but saw " + actual; }
                return this.actual == expected;
            }
        });
    });
    it("should compare arrays", function ()
        {
            var array1 = { type: 2, item: 'D', itemId: 'D', newIndex: -1, oldIndex: 3 };
            var array2 = { type: 2, item: 'D', itemId: 'D', newIndex: -1, oldIndex: 2 };
            expect(array1).arrayComparison(array2);
        });
});

答案 1 :(得分:0)

编写自定义格式化程序以获得漂亮的输出是不方便的,因为它会强制您为涉及自定义对象的每个测试编写自定义格式化程序。例如。您必须复制[{key: new MyObject() }][new MyObject()]的自定义格式设置逻辑。如果有一种方法可以指定MyObject的序列化方式,那将会更加方便。

这可以通过jasmineToString方法完成。如果函数中存在此函数,则Jasmine将打印其返回值,而不是递归处理该对象。这适用于所有版本的Jasmine(1.3,2.0,2.1,2.3)。

这是一个例子(故意测试失败):

function MyObject(id) {
    this.id = id;
    this.junk = 'bla bla'; // I do not want to see this.
}

it('should be pretty', function() {
    MyObject.prototype.jasmineToString = function() {
        return 'MyObject(' + this.id + ')';
    };
    expect([new MyObject(123)]).toBe(new MyObject('different'));
    // "Expected [ MyObject(123) ] to be MyObject(different)."
});
it('should be ugly', function() {
    MyObject.prototype.jasmineToString = undefined;
    expect([new MyObject(123)]).toBe(new MyObject('different'));
    // "Expected [ MyObject({ id: 123, junk: 'bla bla' }) ] to be ..."
});
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.3.4/jasmine.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.3.4/jasmine.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.3.4/jasmine-html.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.3.4/boot.js"></script>