如何为单元测试设置私有 svelte 变量?

How could I set a private svelte variable for the unit testing?

提问人:manymanymore 提问时间:9/27/2023 更新时间:9/27/2023 访问量:45

问:

如何为单元测试设置私有 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 属性,即我不想做 .我想保留组件的内部状态,但我想嘲笑它。aa.svelteaexport let a = "b";a

模拟 Svelte 私有 测试库

评论


答:

1赞 H.B. 9/27/2023 #1

如果您使用该标志进行编译,您将在组件上获得用于捕获和设置组件状态的附加功能,例如,默认的 REPL 及其状态生成:devname

$$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>

REPL的

评论

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
我添加了一些额外的解释和一个示例。