【问题标题】:How to test void method with Jest如何用 Jest 测试 void 方法
【发布时间】:2020-12-07 20:27:27
【问题描述】:

我想测试记录器是否正确递增(使用 Jest)。查看下面的代码,这意味着我想检查增量 (1)(即 void myMethod 的内容)是否被调用。

// myScript.ts
import dd from 'datadog-metrics';

export class MyClass { 
    private bufferedMetricsLogger: dd.BufferedMetricsLogger; 

    constructor(bufferedMetricsLogger: dd.BufferedMetricsLogger) { 
        this.bufferedMetricsLogger = bufferedMetricsLogger; 
    } 

    public myMethod(myInput: String): void { 
        this.bufferedMetricsLogger.increment('my.key.name', 1, [`myTag:${myInput}`]);  // (1)
    }
}

// myScript.test.ts
import { mock, instance, verify } from 'ts-mockito'; 
import { BufferedMetricsLogger } from 'datadog-metrics'; 
import { myClass } from 'path/to/myScript'; 

describe('Testing MyClass', () => { 
    it('verify that myMethod increments', () => { 
        const mockedBufferedMetricsLogger: BufferedMetricsLogger = mock(BufferedMetricsLogger); 
        const bufferedMetricsLogger:       BufferedMetricsLogger = instance(mockedBufferedMetricsLogger); 

        const mockMyClass: MyClass    = mock(MyClass); 
        const myClassOption1: MyClass = instance(mockMyClass); 
        const myClassOption2: MyClass = new MyClass(mockedBufferedMetricsLogger); 

        myClassOption1.myMethod('XXX');                                       // Option 1
        myClassOption2.myMethod('XXX');                                       // Option 2
        bufferedMetricsLogger.increment('my.key.name', 1, [`myTag:${XXX}`]);  // Option 3
        verify(mockedBufferedMetricsLogger.increment('my.key.name', 1, [`myTag:${XXX}`])).once();
    })
}); 

我尝试了三种不同的Options。每个Option 都会产生消息

Expected "increment(strictEqual(my.key.name)", strictEqual(1), strichtEqual([myTag:XXX]))" to be called 1 time(s). But has been called 0 time(s). 

其实Option 1Option 2 都是我想要的。对于Option 3,我刚刚尝试过,因为我认为这肯定会起作用。

有人可以帮我吗?

提前致谢。

【问题讨论】:

    标签: javascript typescript jestjs void ts-mockito


    【解决方案1】:

    您的代码中的问题是您将数组作为第三个参数传递,并且正如您在返回的消息中看到的那样,它正在尝试使用 strictEqual (===) 来检查它。你可以使用mockito提供的deepEqual函数得到想要的结果。

    verify(mockedBufferedMetricsLogger.increment('my.key.name', 1, deepEqual([`myTag:${XXX}`]))).once();
    

    并确保您正确处理了参数,因为我必须稍微更改代码才能使其正常工作。这是我的完整工作代码:

    // myScript.ts
    import { BufferedMetricsLogger } from 'datadog-metrics';
    
    export class MyClass { 
        private bufferedMetricsLogger: BufferedMetricsLogger; 
    
        constructor(bufferedMetricsLogger: BufferedMetricsLogger) { 
            this.bufferedMetricsLogger = bufferedMetricsLogger; 
        } 
    
        public myMethod(myInput: String): void {
            this.bufferedMetricsLogger.increment('my.key.name', 1, [`myTag:${myInput}`]);  // (1)
        }
    }
    
    
    // myScript.test.ts
    import { mock, instance, verify, deepEqual } from 'ts-mockito'; 
    import { BufferedMetricsLogger } from 'datadog-metrics'; 
    import { MyClass } from './myScript'; 
    
    describe('Testing MyClass', () => { 
        it('verify that myMethod increments', () => { 
            const mockedBufferedMetricsLogger: BufferedMetricsLogger = mock(BufferedMetricsLogger);
            const bufferedMetricsLogger:       BufferedMetricsLogger = instance(mockedBufferedMetricsLogger); 
    
            const myClassOption1 = new MyClass(bufferedMetricsLogger);
            // const bufferedMetricsLogger:       BufferedMetricsLogger = instance(mockedBufferedMetricsLogger); 
    
            // const mockMyClass: MyClass    = mock(MyClass); 
            // const myClassOption1: MyClass = instance(mockMyClass); 
            // const myClassOption2: MyClass = new MyClass(mockedBufferedMetricsLogger); 
    
            myClassOption1.myMethod('XXX');                                       // Option 1
            // myClassOption2.myMethod('XXX');                                       // Option 2
            // bufferedMetricsLogger.increment('my.key.name', 1, [`myTag:XXX`]);  // Option 3
            verify(mockedBufferedMetricsLogger.increment('my.key.name', 1, deepEqual([`myTag:XXX`]))).once();
        })
    }); 
    

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 1970-01-01
      • 2017-09-18
      • 2021-08-27
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多