Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 重写jasmine单元测试中的只读对象_Javascript_Unit Testing_Typescript_Jasmine - Fatal编程技术网

Javascript 重写jasmine单元测试中的只读对象

Javascript 重写jasmine单元测试中的只读对象,javascript,unit-testing,typescript,jasmine,Javascript,Unit Testing,Typescript,Jasmine,有人知道如何在只读对象(如window或[HtmleElement].style)中重写属性和函数吗 需要测试的函数示例: public static getCSSTransitionEvent(element: HTMLElement): string { let transitions = { 'transition': 'transitionend', 'OTransition': 'oTransitionEnd', 'MozTran

有人知道如何在只读对象(如window或[HtmleElement].style)中重写属性和函数吗

需要测试的函数示例:

public static getCSSTransitionEvent(element: HTMLElement): string {
    let transitions = {
        'transition': 'transitionend',
        'OTransition': 'oTransitionEnd',
        'MozTransition': 'transitionend',
        'WebkitTransition': 'webkitTransitionEnd'
    };

    for (let transition in transitions) {
        if (element.style[transition] !== undefined ) {
            return transitions[transition];
        }
    }
    return;
}
如何将element.style中的transition属性重写为函数在底部返回未定义的测试

另一个例子,如何测试这个if语句

function isCryptoAvailable() {
    if (typeof (window.crypto) !== 'undefined' && typeof (window.crypto.getRandomValues) !== 'undefined') {
        return true
    }
    else {
        return false
    }
}

这是通过属性描述符完成的。只读属性的
可写
描述符属性设置为false。只要它们是
可配置的
,就可以使用
对象重新定义它们。定义属性
类似:

 const cryptoDescriptor = Object.getOwnPropertyDescriptor(window, 'crypto');

 afterEach(() => {
   if (origCryptoDescriptor) {
     delete window.crypto;
     Object.defineProperty(window, 'crypto', cryptoDescriptor);
   }
 });

 it('...', () => {
   expect(origCryptoDescriptor).toBeTruthy();
   expect(origCryptoDescriptor.configurable).toBeTruthy();

   const cryptoMock = ...;
   delete window.crypto;
   window.crypto = cryptoMock;
   ...
 });
描述符应在每次之后在
中恢复,因为即使测试失败也会执行描述符。如果属性不可配置,测试将失败。这在某些浏览器中是可能的,所以在已知失败的浏览器中,测试应该从套件中排除

同样,对于涉及非全局对象(如
HTMLElement
object)的函数,如果可以完全模拟该对象,而不是模拟其属性,那么这是一种更好的策略