sass-true无法直接测试mixin输出,因其断言仅支持sass值比较,而mixin不返回值、只生成css;必须用@include assert { @include output { ... } @include expect { ... } }结构比对实际css字符串。

SCSS 本身没有运行时,不能像 JavaScript 那样直接跑 assert 或捕获副作用,所以所谓“CSS 单元测试”,实际是测函数返回值、混入(mixin)生成的 CSS 片段、或变量计算逻辑——sass-true 是目前最成熟、被 Dart Sass 官方生态接纳的方案,但它只在特定条件下有效。
为什么 sass-true 无法直接测试混入输出?
sass-true 的 @include assert-equal 等断言只能比较 Sass 值(如 1.5rem、(a: 1, b: 2)),而混入不返回值,只产生 CSS 输出。试图对 @include font-size('large') 做 assert-equal 会报错或静默失败。
必须改用 @include assert { @include output { ... } @include expect { ... } } 结构,让 True 拦截编译过程中的 CSS 字符串并比对。
- 混入测试必须包裹在
@include assert块里,不能裸写 -
@include output内只能调用混入,不能写变量赋值或条件逻辑 -
@include expect中的 CSS 必须与实际输出**逐字符一致**(包括空格、换行、分号位置) - 如果混入内部用了
@import或@use其他模块,要确保sass-true的--load-path能解析到它们
@use 'pkg:sass-true' as * 报错 “Cannot find module” 怎么办?
这不是 Node.js 模块路径问题,而是 Dart Sass 的包解析机制:它不走 node_modules 的 require(),而是依赖 --load-path 或 pkg: 协议。
错误常见于两类场景:
- 用
sassCLI 运行但没加--load-path=node_modules/sass-true - 在 JS 环境中调用
sass.compileString()时没传importers配置
正确做法是:
CLI 方式:sass --load-path=node_modules/sass-true test.scss
JS API 方式(推荐):
import { compileString } from 'sass';
import path from 'path';
compileString('@use "pkg:sass-true" as *; @include describe("test") { ... }', {
loadPaths: [path.resolve('node_modules/sass-true')]
});
混入测试中 CSS 输出比对失败的常见原因
看起来一样的 CSS,测试却 fail,大概率是输出格式不一致:
- Dart Sass 默认压缩输出(无空格、单行),而
@include expect里写了带缩进的多行 CSS - 混入中用了
@if分支,但测试只覆盖了主路径,分支未触发 - 字体单位用了
px,但项目全局启用了px-to-rem转换,导致实际输出是rem - 使用了
@debug或@warn,干扰了输出流(True 会把警告内容混入 CSS 字符串)
建议在测试前统一 normalize:
写一个辅助函数:@function normalize-whitespace($str) { @return str-replace(str-replace($str, '\n', ''), '\t', ''); },再用 assert-string-equal 替代 assert 块。
CI 环境下运行 sass-true 测试容易忽略的点
本地能过,CI 报错,往往卡在环境差异上:
- CI 使用的是旧版 Dart Sass(
sass-truev4+ 要求 v1.45.0+) -
npm install没装sass-embedded(Dart Sass 的二进制绑定),导致 fallback 到纯 JS 版本,性能差且部分特性不支持 - 测试文件路径用了相对路径(如
@use '../src/_functions'),但 CI 工作目录不同,--load-path没同步调整 - 没加
@include report;在测试文件末尾,导致 CI 日志里看不到失败详情,只显示 “0 passed, 0 failed”
最稳妥的做法是:所有测试入口统一用 JS 脚本驱动(如 test/sass.test.js),显式控制 loadPaths 和 Sass 版本,避免 CLI 行为漂移。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











