如何在异步笑话 test.each 案例中传入 done() 参数

Posted

技术标签:

【中文标题】如何在异步笑话 test.each 案例中传入 done() 参数【英文标题】:How to pass in the done() parameter on an async jest test.each case 【发布时间】:2020-05-13 09:04:12 【问题描述】:

我正在尝试编写一个测试异步方法的 jest 测试用例,我想传入 done() 参数,所以 jest 在结束测试之前等待它被触发,但是,我不确定在哪里把它说出来。

有什么想法吗?

const testcases = [
        [
            'Crew',
            [1,2,3],
            Enum.Level1
        ],
        [
            'Staff',
            [4,5,6],
            Enum.Level2
        ]
    ];
test.each(testcases )(
        'Should be able to load differing cases %p',
        (
            typeName: string,
            initalVals: string[],
            type: LevelType
        ) => 
            // some call that updates mobx store state

            when(
                () => mobxstoreProperty.length == initalVals.length,
                () => 
                    // my assertions

                    done();
                
            );
        
    );

对于一个单一的笑话测试,我可以这样做:

test('my single test', done => 
  // some call that updates mobx store state

     when(
       () => mobxstoreProperty.length == initalVals.length,
       () => 
         // my assertions
         done();
       
    );
);

只是不确定当我使用test.each 方法时该怎么做。

【问题讨论】:

【参考方案1】:

要传递和评估donedone 回调应该是测试用例参数函数中的最后一个参数。

另外,当你在 typescript 中使用 test.each 方法时,这里是处理打字的方法:

// found at https://github.com/DefinitelyTyped/DefinitelyTyped/issues/34617

it.each<number | jest.DoneCallback>([1, 2, 3])(
    'dummy: %d',
    (num: number, done: jest.DoneCallback) => 
        done();
    ,
);

【讨论】:

【参考方案2】:

我使用命名参数,我可以添加done() 方法作为最后一个函数参数。比如像这样:

const testcases: 
    typeName: string;
    initalVals: string[],
    type: LevelType
[] = [
    
        typeName: 'Crew',
        initalVals: [1,2,3],
        type: Enum.Level1
    ,
    
        typeName: 'Staff',
        initalVals: [4,5,6],
        type: Enum.Level2
    ,
];
test.each(testcases)(
    'Should be able to load differing cases %p',
    // Must use `any` for `done`, as TypeScript infers the wrong type:
    (typeName, initalVals, type, done: any) => 
        // some call that updates mobx store state
        when(
            () => mobxstoreProperty.length == initalVals.length,
            () => 
                // my assertions

                done();
            
        );
    
);

我还没有测试你是否可以将 done() 方法添加为带有数组参数的最后一个参数,但也许这也可以。

【讨论】:

@uneatenbreakfast 这能回答你的问题吗?如果是,请采纳答案。

以上是关于如何在异步笑话 test.each 案例中传入 done() 参数的主要内容,如果未能解决你的问题,请参考以下文章

笑话:Timer 和 Promise 不能很好地工作。 (setTimeout 和异步函数)

Python爬虫案例:利用Python爬取笑话网

如何异步处理 WCF 的传入调用?

如何实现webservice的异步调用

如何检测字符串中的笑话?

Promise如何使用?全方位解析,5分钟搞懂异步#yyds干货盘点#