定制茉莉花匹配器和量角器

ale*_*cxe 14 javascript testing jasmine angularjs protractor

我们添加了一个toHaveClass 自定义的茉莉花匹配器,为了使其工作,我们不得不将其添加到beforeEach()(在本主题的帮助下).

并且,为了遵循DRY原则并避免在需要的每个beforeEach()规范中重复匹配器定义toHaveClass,我们在以下位置添加了一个beforeEach()onPrepare():

onPrepare: function () {
    var jasmineReporters = require("jasmine-reporters");
    require("jasmine-expect");

    // ...

    // custom matchers
    beforeEach(function() {
        jasmine.addMatchers({
            toHaveClass: function() {
                return {
                    compare: function(actual, expected) {
                        return {
                            pass: actual.getAttribute("class").then(function(classes) {
                                return classes.split(" ").indexOf(expected) !== -1;
                            })
                        };
                    }
                };
            }
        });
    });
},
Run Code Online (Sandbox Code Playgroud)

它实际上是有效的,但是每当我看到beforeEach()量角器配置中的块时,我就会有一种微观凹陷和强烈的感觉,它不是定义匹配器的好地方.

问题:

是否有更好的方法或地点来定义自定义匹配器?

Mic*_*nov 8

我看到的最简单的解决方案是将此beforeEach块移动到一个单独的文件中,并将其置于内部onPrepare,就像使用供应商库一样:

onPrepare: function () {
    var jasmineReporters = require("jasmine-reporters");
    require("jasmine-expect");
    require('./tests/support/jasmine-custom-matchers'); // inject custom matchers
    // ....
}
Run Code Online (Sandbox Code Playgroud)

代码beforeEach不应该要求任何改变:

// /tests/support/jasmine-custom-matchers.js

beforeEach(function() {
    jasmine.addMatchers({
        toHaveClass: function() {
            return {
                compare: function(actual, expected) {
                    return {
                        pass: actual.getAttribute("class").then(function(classes) {
                            return classes.split(" ").indexOf(expected) !== -1;
                        })
                    };
                }
            };
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

我不认为你应该export从这个文件中得到什么,它只会通过它来生效require.