我正在寻找一种方法来创建唯一的确定性测试ID,以用于端到端测试。这意味着运行任何迭代都将为完全相同的组件产生完全相同的id,以便测试将有可靠的方式引用项目。
从在每个按钮上应用指令的示例开始:
@Directive({
selector: 'button',
})
export class FormControlPropertiesDirective {
constructor(
private element: ElementRef,
) {
}
}
有什么方法可以应用算法或使用元素的某些不同属性来创建确定性的东西吗?
答案 0 :(得分:0)
如果您设法将组件链接到某个模型,则可以在该模型上使用哈希函数...像这样的哈希函数(取自Simple (non-secure) hash function for JavaScript?个问题的答案,并将其转换为简单的功能):
hashObject(o: any) {
var l = 2;
var i, c, r = [];
for (i = 0; i < l; i++)
r.push(i * 268803292);
function stringify(o) {
var i, r;
if (o === null) return "n";
if (o === true) return "t";
if (o === false) return "f";
if (o instanceof Date) return "d:" + o.toString();
i = typeof o;
if (i === "string") return "s:" + o.replace(/([\\\\;])/g, "\\$1");
if (i === "number") return "n:" + o;
if (o instanceof Function) return "m:" + o.toString().replace(/([\\\\;])/g, "\\$1");
if (o instanceof Array) {
r = [];
for (i = 0; i < o.length; i++)
r.push(stringify(o[i]));
return "a:" + r.join(";");
}
r = [];
for (i in o) {
r.push(i + ":" + stringify(o[i]));
}
return "o:" + r.join(";");
}
o = stringify(o);
for (i = 0; i < o.length; i++) {
for (c = 0; c < r.length; c++) {
r[c] = (r[c] << 13) - (r[c] >> 19);
r[c] += o.charCodeAt(i) << (r[c] % 24);
r[c] = r[c] & r[c];
}
}
for (i = 0; i < r.length; i++) {
r[i] = this.toHex(r[i]);
}
return r.join("");
}
toHex(number: number): string {
var ret = ((number < 0 ? 0x8 : 0) + ((number >> 28) & 0x7)).toString(16) + (number & 0xfffffff).toString(16);
while (ret.length < 8) ret = "0" + ret;
return ret;
}
或者,如果您真的只需要生成测试ID,则可以使用faker.js(https://github.com/marak/Faker.js/)。通过为其数据生成器提供种子,您可以获得确定性的结果