当我的一个Jest测试失败时,我想存储一个屏幕截图,但只有当它失败时才会存在。
以下是我的测试代码的一部分,afterEach中的 describe('Page', () => {
it('should contain Text in the header', async () => {
// Arrange
const page = new Page(driver);
// Act
await page.open();
// Assert
expect(await page.getHeaderText()).toBe('Something');
});
afterEach(async () => {
if (!passed) takeScreenshot();
await driver.quit();
});
});
部分无效。
var passed = jasmine.getEnv().currentSpec.results().passed();
使用茉莉花,我会做类似的事情:
{{1}}
但我找不到类似于Jest的东西。也许还有另一种解决方案,比如对每个失败的预期截取屏幕截图?我尝试了一下try / catch,但测试总是通过......
如果我的测试在afterEach中失败,我怎样才能与Jest联系?
答案 0 :(得分:4)
afterEach
中进行访问。 @Niels van Reijmersdal处在正确的轨道上。但是,在specDone
中截取屏幕截图的缺点是,它在之后 afterEach
之后运行,因此,如果afterEach
中有某些内容可以向后导航屏幕上,您最终拍摄的屏幕截图将不代表错误发生的位置。这是一个允许您在错误发生后立即截图的答案。
为specStarted
添加自定义的Jasmine报告程序,并将规范结果存储到jasmine.currentTest
。
jasmine.getEnv().addReporter( {
specStarted: result => jasmine.currentTest = result
} );
一个不直观的事情是,即使我们在结果存入之前将其存储在specStarted
中,jasmine.currentTest
也会存储对result
对象的引用,该引用会动态更新随着规范的运行,因此当我们在afterEach
中访问规范时,它将正确保存规范的结果。
在您的failedExpectations
中检查afterEach
,并在发生故障时进行截图。
afterEach( async () => {
if ( jasmine.currentTest.failedExpectations.length > 0 ) { // There has been a failure.
await driver.takeScreenshot();
}
} );
答案 1 :(得分:2)
似乎jasmine对象可用于Jest测试,但currentcpec已在2.x版本中删除。
我找到了使用jasmine自定义报告的替代方法。只需确保将driver.quit()
移动到记者,因为测试后可能仍需要驱动程序。
以下是报告人在测试结束时处理失败测试的一个简单示例:
const reporter = {
specDone: async (result) => {
if (result.status === 'failed') {
takeScreenshot(result.description);
}
await driver.quit();
},
};
jasmine.getEnv().addReporter(reporter);
describe('Page', () => {
it('should contain Text in the header', async () => {
// Arrange
const page = new Page(driver);
// Act
await page.open();
// Assert
expect(await page.getHeaderText()).toBe('Something');
});
});