zoukankan      html  css  js  c++  java
  • [XState] Using global actions prop for testing

    Let's say we have a State Machine Model:

    import { createMachine, interpret } from "xstate";
    
    const elBox = document.querySelector("#box");
    
    const setPoint = (context, event) => {
      // Set the data-point attribute of `elBox`
      // ...
      elBox.dataset.point = `${event.clientX} - ${event.clientY}`;
    };
    
    const machine = createMachine(
      {
        initial: "idle",
        states: {
          idle: {
            on: {
              mousedown: {
                // Add your action here
                // ...
                target: "dragging",
                actions: [setPoint],
              },
            },
          },
          dragging: {
            on: {
              mouseup: {
                target: "idle",
              },
            },
          },
        },
      }
    );
    
    const service = interpret(machine);
    
    service.onTransition((state) => {
      elBox.dataset.state = state.value;
    });
    
    service.start();
    
    elBox.addEventListener("mousedown", (event) => {
      service.send(event);
    });
    
    elBox.addEventListener("mouseup", (event) => {
      service.send(event);
    });

    We have inline action for 'idle' state when mousedown event happen, it call 'setPoint' function.

    Question is how to test those actions get triggered in Unit testing?

    We can use global 'actions' prop to override existing inline function:

    const machine = createMachine(
      {
        initial: "idle",
        states: {
          idle: {
            on: {
              mousedown: {
                // Add your action here
                // ...
                target: "dragging",
                actions: [setPoint],
              },
            },
          },
          dragging: {
            on: {
              mouseup: {
                target: "idle",
              },
            },
          },
        },
      },
      {
        actions: {
          setPoint: () => {
            console.log("set point");
          },
        },
      }
    );

    Now it will only response with console log. That can be used in Unit testing with some ENV case switcher.

  • 相关阅读:
    Maven 那点事儿
    maven pom文件详解
    Maven Missing artifact jar
    JVM调优总结 -Xms -Xmx -Xmn -Xss
    LoadRunner做性能测试 从设计到分析执行
    linux内核参数注释与优化
    tcpdump详解
    [转]Linux服务器上11种网络连接状态 和 TCP三次握手/四次挥手详解
    MSM--Memcached_Session_Manager介绍及使用
    黏性Session和非黏性Session
  • 原文地址:https://www.cnblogs.com/Answer1215/p/13348168.html
Copyright © 2011-2022 走看看