如何在 Next.js styled-jsx 中使用笑话覆盖率?

How can I use jest coverage in Next.js styled-jsx?

我正在尝试将测试框架 Jest 与 Next.js 和 styled-jsx 一起使用。

这是我的外在css风格。

import css from 'styled-jsx/css';

export const TextStyle = css`
     p {
         font-size: 14px;
         color: #a8a8a8;
     }
`;

这是我的 package.json 脚本。效果不错。

"test": "jest --verbose",

我想使用覆盖选项。所以我尝试了这个 "test": "jest --coverage --verbose",但它不起作用。

ReferenceError: css is not defined

我读过这个https://github.com/zeit/styled-jsx/issues/436。但是,这个问题仍然悬而未决,对我没有帮助。

我该如何解决?

styled-jsx docs 提到如何解决它,但对我来说效果不佳。

我通过执行以下操作使其工作: 像这样将 package.json 测试脚本中的节点环境设置为“测试”(如果需要,也可以添加 --verbose 标志):

    "test": "NODE_ENV=test jest",
    "test:coverage": "NODE_ENV=test jest --coverage"

在你的 babel 配置中(.babelrc 在我的例子中)将 babel-test: true 添加到 test env 配置中(参考 Next docs了解更多详情):

{
  // this is your original config, it's required if you don't have a babel config yet and are using `Next` since `Next` normally does it under the hood for you:
  "presets": [
    [
      "next/babel",
    ]
  ],
  // this is what you're adding:
  "env": {
    "test": {
      "presets": [
        [
          "next/babel",
          {
            "styled-jsx": {
              "babel-test": true
            }
          }
        ]
      ]
    }
  }
}

您的测试现在应该通过了,但可能会显示一条警告: styled-jsx/css: if you are getting this error it means that your css tagged template literals were not transpiled.

在这种情况下,您应该为 styled-jsx/css 添加一个 jest 自动模拟,方法是从项目的根目录添加一个具有 这个确切路径 的新文件(__mocks__ 文件夹必须是 node_modules 文件夹的兄弟文件夹)/__mocks__/styled-jsx/css.js:

function css() {
  return ""
}

module.exports = css

*注意:整个设置所做的是在您 运行 测试时禁用 styled-jsx 转译,这意味着生成的 类 不会在您的测试组件中生成。例如,在我的例子中,这破坏了我的测试,因为我依赖于生成的 类 来隐藏一些元素,而我的测试依赖于那些被隐藏的元素。我现在正在想办法解决这个问题,但这对你来说可能不是问题。