在我的 Svelte 应用程序中,我尝试使用svelte-testing-library 进行测试,当特定 API 请求(使用msw)成功时删除元素,但在返回错误时不会删除。
检查快乐路径很容易使用
const el = await screen.findByText(/foo/);
await waitForElementToBeRemoved(el);
但是,当请求失败时,检查元素是否被删除的“正确”方法是什么?我可以添加一个自定义 setTimeout(...) 但这似乎不是最佳解决方案。
有没有一种方法可以在做出断言之前轻松确保请求已完成并处理?
Foo.svelte
<script>
let deleted = false;
const deleteFoo = () => {
window
.fetch(`/foo`, {
method: 'DELETE',
})
.then((res) => {
if (res.ok) {
deleted = true;
}
});
};
</script>
{#if !deleted}
<button on:click={deleteFoo}>delete</button>
{/if}
Foo.spec.js
import {render, fireEvent, waitForElementToBeRemoved} from '@testing-library/svelte';
import {server, rest} from './server';
import Foo from './Foo';
test('button hidden on success', async () => {
server.use(
rest.delete('/foo', async (req, res, ctx) => {
return res(ctx.status(200));
})
);
const {getByText, getByRole} = render(Foo, {});
const btn = getByText('delete');
fireEvent.click(btn);
await waitForElementToBeRemoved(btn);
});
test('button visible on error', async () => {
server.use(
rest.delete('/foo', async (req, res, ctx) => {
return res(ctx.status(500));
})
);
const {getByText, getByRole} = render(Foo, {});
const btn = getByText('delete');
fireEvent.click(btn);
await new Promise((r) => setTimeout(r, 10));
await getByText('delete');
});