我正在使用Protractor和Astrolabe编写一些页面对象驱动的测试。
Jasmine用于实现describe
/ it
样式规范。
使用this.addMatchers
(TypeError: Object #<Object> has no method 'toContainLowered'
)无法添加自定义匹配器,因此我使用this guide来实现它们。
似乎工作正常,直到我仔细查看我的测试运行的输出:
$> grunt test:func
Running "test:func" (test) task
Running "shell:protractor" (shell) task
Using the selenium server at http://localhost:4444/wd/hub
..
Finished in 6.727 seconds
2 tests, 1 assertion, 0 failures
这是我的代码:
var loginPage = require('./../pages/loginPage');
describe('Login page', function () {
var ptor = loginPage.driver;
beforeEach(function () {
jasmine.Matchers.prototype.toContainLowered = function (expected) {
return this.actual.toLowerCase().indexOf(expected) > -1;
};
loginPage.go();
ptor.waitForAngular();
});
it('should display login page', function () {
expect(loginPage.currentUrl).toEqual(ptor.baseUrl);
});
it('should display an error when the username or password is incorrect', function() {
loginPage.login('bad', 'credentials');
ptor.waitForAngular();
expect(loginPage.lblError.getText()).toContainLowered('invalid username and/or password');
// expect(loginPage.lblError.getText()).toContain('Invalid Username and/or Password');
});
});
如果我取消注释最后一行并删除toContainLowered
匹配器,我会得到正确的输出:
2 tests, 2 assertions, 0 failures
我很难调试这个基于承诺的代码,任何放置console.log(this.actual.toLowerCase().indexOf(expected) > -1);
的努力都会打印false
,这会令人困惑。
我甚至尝试用return false;
替换整个函数定义。哪个仍然没有做任何事情。最后,我尝试将没有参数传递给匹配器,它应该抛出一个无效的参数错误或其他东西。
在使用Protractor / Astrolabe测试时,如何在Jasmine中定义自己的匹配器?
答案 0 :(得分:2)
我遇到了与匹配器类似的问题,尤其是.not匹配器,这些似乎都不起作用。我假设量角器正在扩展Jasmine匹配器以处理承诺,并且该扩展尚未应用于.not或自定义匹配器。
在我的情况下,我想要一个.not.toMatch,所以我只是写了一个复杂的正则表达式给了我想要的东西,而没有嵌入正则表达式。
我注意到你的匹配器被称为“toContainLowered”,所以也许你正在寻找小写,因此你可以通过使用.toMatch来使用正则表达式来实现这一点?
我在量角器github上提出的问题是:https://github.com/angular/protractor/issues/266
我还在这个代码文件中看到:https://github.com/angular/protractor/blob/master/jasminewd/spec/adapterSpec.js,最后一次提交被标记为“修补后的匹配器应该不理解”。这可能会为您修复自定义匹配器,或者提供修复该自定义匹配器需要执行的操作的指示。
编辑:现在进一步研究那个问题主题,我发现你已经在那里了。这使得我的回答有些多余。 : - )