Создание уникальных и детерминированных тест-идентификаторов данных программно - PullRequest
0 голосов
/ 28 июня 2019

Я ищу способ создания уникальных и детерминированных идентификаторов тестов, которые будут использоваться для сквозного тестирования. Это будет означать, что при выполнении любой итерации будет получен точно такой же идентификатор для точно такого же компонента, чтобы у тестов был надежный способ ссылки на элемент.

Начиная с примера применения директивы к каждой кнопке:

@Directive({
    selector: 'button',
})
export class FormControlPropertiesDirective {

    constructor(
        private element: ElementRef,
    ) {
    }
}

Можно ли как-нибудь применить алгоритм или использовать какое-то отличное свойство элемента для создания чего-то детерминированного?

1 Ответ

0 голосов
/ 28 июня 2019

Если вам удастся связать ваши компоненты с определенной моделью, вы можете использовать хеш-функцию над этой моделью ... хеш-функцию, подобную этой (взято из ответа на этот вопрос Простая (небезопасная) хеш-функциядля 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;
    }

Или, если вам действительно нужно сгенерировать тестовые идентификаторы, вы можете использовать faker.js (https://github.com/marak/Faker.js/). Предоставивсемя к его генератору данных вы можете получить детерминированные результаты

...