期望数组中的项目
Expect item in array
我的一个测试要求错误消息文本是多个值之一。由于 getText()
returns promise 我不能使用 toContain()
茉莉匹配器。以下将不起作用,因为 protractor
(jasminewd
底层)不会解决匹配器第二部分中的承诺,在这种情况下为 toContain()
:
expect(["Unknown Error", "Connection Error"]).toContain(page.errorMessage.getText());
问题:有没有办法检查一个元素是否在一个带有 jasmine+protractor 的数组中,其中一个元素是一个 promise?
换句话说,我正在寻找 toContain()
的逆函数,以便 expect()
隐式解析传入的承诺。
作为变通方法,我可以使用 then()
:
显式解决承诺
page.errorMessage.getText().then(function (text) {
expect(["Unknown Error", "Connection Error"]).toContain(text);
});
我不确定这是否是最佳选择。我也可以接受基于 jasmine-matchers
.
等第三方的解决方案
例如,这种断言存在于Python:
self.assertIn(1, [1, 2, 3, 4])
看来您需要自定义匹配器。取决于您使用的 Jasmine 版本:
与茉莉花 1:
this.addMatchers({
toBeIn: function(expected) {
var possibilities = Array.isArray(expected) ? expected : [expected];
return possibilities.indexOf(this.actual) > -1;
}
});
与茉莉花 2:
this.addMatchers({
toBeIn: function(util, customEqualityTesters) {
return {
compare: function(actual, expected) {
var possibilities = Array.isArray(expected) ? expected : [expected];
var passed = possibilities.indexOf(actual) > -1;
return {
pass: passed,
message: 'Expected [' + possibilities.join(', ') + ']' + (passed ? ' not' : '') + ' to contain ' + actual
};
}
};
}
});
您必须在每个 describe
块的 beforeEach
部分执行此操作。
你的期望看起来像:
expect(page.errorMessage.getText()).toBeIn(["Unknown Error", "Connection Error"]);
另一种解决方案是将 .toMatch()
匹配器与 Regular Expressions 一起使用,特别是一个特殊字符 |
(称为 "or" ), 只允许匹配一个条目成功:
expect(page.errorMessage.getText()).toMatch(/Unknown Error|Connection Error/);
对我来说,您确定的解决方法是最佳解决方案。但是,我们不应该忘记这是一个 异步执行 并且您可能需要考虑 Jasmine's asynchronous support.
然后,您的测试将如下所示:
it('should check item is in array', function(done){ //Note the argument for callback
// do your stuff/prerequisites for the spec here
page.errorMessage.getText().then(function (text) {
expect(["Unknown Error", "Connection Error"]).toContain(text);
done(); // Spec is done!
});
});
注意: 如果您不将此 done
参数传递给 spec callback
,它将 运行 完成而不会失败,但不会在该规范的执行结果中报告任何断言(换句话说,该规范将有 0
个断言),这可能会导致混淆。
我的一个测试要求错误消息文本是多个值之一。由于 getText()
returns promise 我不能使用 toContain()
茉莉匹配器。以下将不起作用,因为 protractor
(jasminewd
底层)不会解决匹配器第二部分中的承诺,在这种情况下为 toContain()
:
expect(["Unknown Error", "Connection Error"]).toContain(page.errorMessage.getText());
问题:有没有办法检查一个元素是否在一个带有 jasmine+protractor 的数组中,其中一个元素是一个 promise?
换句话说,我正在寻找 toContain()
的逆函数,以便 expect()
隐式解析传入的承诺。
作为变通方法,我可以使用 then()
:
page.errorMessage.getText().then(function (text) {
expect(["Unknown Error", "Connection Error"]).toContain(text);
});
我不确定这是否是最佳选择。我也可以接受基于 jasmine-matchers
.
例如,这种断言存在于Python:
self.assertIn(1, [1, 2, 3, 4])
看来您需要自定义匹配器。取决于您使用的 Jasmine 版本:
与茉莉花 1:
this.addMatchers({
toBeIn: function(expected) {
var possibilities = Array.isArray(expected) ? expected : [expected];
return possibilities.indexOf(this.actual) > -1;
}
});
与茉莉花 2:
this.addMatchers({
toBeIn: function(util, customEqualityTesters) {
return {
compare: function(actual, expected) {
var possibilities = Array.isArray(expected) ? expected : [expected];
var passed = possibilities.indexOf(actual) > -1;
return {
pass: passed,
message: 'Expected [' + possibilities.join(', ') + ']' + (passed ? ' not' : '') + ' to contain ' + actual
};
}
};
}
});
您必须在每个 describe
块的 beforeEach
部分执行此操作。
你的期望看起来像:
expect(page.errorMessage.getText()).toBeIn(["Unknown Error", "Connection Error"]);
另一种解决方案是将 .toMatch()
匹配器与 Regular Expressions 一起使用,特别是一个特殊字符 |
(称为 "or" ), 只允许匹配一个条目成功:
expect(page.errorMessage.getText()).toMatch(/Unknown Error|Connection Error/);
对我来说,您确定的解决方法是最佳解决方案。但是,我们不应该忘记这是一个 异步执行 并且您可能需要考虑 Jasmine's asynchronous support.
然后,您的测试将如下所示:
it('should check item is in array', function(done){ //Note the argument for callback
// do your stuff/prerequisites for the spec here
page.errorMessage.getText().then(function (text) {
expect(["Unknown Error", "Connection Error"]).toContain(text);
done(); // Spec is done!
});
});
注意: 如果您不将此 done
参数传递给 spec callback
,它将 运行 完成而不会失败,但不会在该规范的执行结果中报告任何断言(换句话说,该规范将有 0
个断言),这可能会导致混淆。