提问人:manymanymore 提问时间:9/27/2023 更新时间:9/27/2023 访问量:45
如何为单元测试设置私有 svelte 变量?
How could I set a private svelte variable for the unit testing?
问:
如何为单元测试设置私有 svelte 变量?
例如,我有组件:
//a.svelte
<script>
let a = "b";
</script>
<div data-testid="c">{a}</div>
我正在尝试测试该组件:
import { screen } from "@testing-library/svelte";
import a from "./a.svelte;
...
//arrange
const aMock = "d";
//act
render(a);
//assert
expect(screen.getByTestId("c").textContent).toBe("d");
如何设置内部?我不想使 a 属性,即我不想做 .我想保留组件的内部状态,但我想嘲笑它。a
a.svelte
a
export let a = "b";
a
答:
1赞
H.B.
9/27/2023
#1
如果您使用该标志进行编译,您将在组件上获得用于捕获和设置组件状态的附加功能,例如,默认的 REPL 及其状态生成:dev
name
$$self.$capture_state = () => ({ name });
$$self.$inject_state = $$props => {
if ('name' in $$props) $$invalidate(0, name = $$props.name);
};
if ($$props && "$$inject" in $$props) {
$$self.$inject_state($$props.$$inject);
}
您还可以通过 props 注入初始状态。$$inject
由于通常无法从外部更改本地状态,因此编译器不会生成任何渲染更新代码,除非在某处分配了局部变量。可以使用虚拟赋值 () 来确保这一点。a = a
设置不同的初始状态并在以后更新它的示例:
<script>
import Component from './Component.svelte';
let c;
let newName = '';
function mount(node) {
c = new Component({
target: node,
props: { $$inject: { name: 'Steve' } },
});
return {
destroy() { c.$destroy(); }
};
}
function changeName() {
c.$inject_state({ name: newName });
}
</script>
<div use:mount />
<input bind:value={newName} />
<button on:click={changeName}>Change</button>
评论
0赞
manymanymore
9/27/2023
某处有关于它的文档吗?例如,似乎有效,但很高兴知道它是如何工作的以及它的作用。$capture_state
0赞
manymanymore
9/27/2023
那么,我该如何更改组件内部呢?从你的例子中不是很清楚吗?我应该使用这三种方法中的哪一种?a
0赞
H.B.
9/27/2023
据我所知,没有这方面的文档,依赖它可能不安全。它被官方工具使用,特别是用于热模块替换,它捕获状态,加载更新的模块,构造新组件并再次注入状态。既然答案被接受,你有没有弄清楚如何使用这些功能?
0赞
manymanymore
9/27/2023
不,我没有。我仍然无法嘲笑.a
0赞
H.B.
9/27/2023
我添加了一些额外的解释和一个示例。
评论