Skip to content

Commit

Permalink
单元测试说明 refAllDecls 的注意事项
Browse files Browse the repository at this point in the history
  • Loading branch information
jinzhongjia committed Jan 9, 2024
1 parent 46b0634 commit fb33684
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 2 deletions.
1 change: 0 additions & 1 deletion learn/basic/advanced_type/opaque.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,4 @@ fn foo(w: *Wat) callconv(.C) void {

`anyopaque` 是一个比较特殊的类型,代表可以接受任何类型的 `opaque`(由于 `opaque` 拥有不同的变量/常量声明和方法的定义,故是不同的类型),常用于与 C 交互的函数中,相当于是 C 的 `void` 类型!


TODO: 添加更多关于该类型使用的示例和说明!
19 changes: 18 additions & 1 deletion learn/engineering/unit-test.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,10 +100,27 @@ const U = union { // U 被顶层测试块引用了
};
```

值得注意的是,嵌套引用测试在全局测试块中引用另一个容器后,并不会递归,也就是说它仅仅会执行容器的顶层测试块和它引用的容器的顶层测试块。
注意,嵌套引用测试在全局测试块中引用另一个容器后,并不会递归,也就是说它仅仅会执行容器的顶层测试块和它引用的容器的顶层测试块。

::: info 🅿️ 提示

zig 的标准库还为我们提供了一个函数 `std.testing.refAllDecls`,专门处理上面这种语法( `_=...` 这种语法看起来并不好看)。

但需要注意的是,`std.testing.refAllDecls` 的实现如下:

```zig
pub fn refAllDecls(comptime T: type) void {
if (!builtin.is_test) return;
inline for (comptime std.meta.declarations(T)) |decl| {
_ = &@field(T, decl.name);
}
}
```

它所使用的 `std.meta.declarations` 只能获取到公共成员(即被 `pub` 修饰的),非公共成员需要我们手动以 `_ = ..` 形式引入测试。

:::

## 跳过测试

跳过测试的一种方法是使用 `zig test` 命令行参数 `--test-filter [text]` 将其过滤掉。这使得测试构建仅包含名称包含提供的过滤器文本的测试。请注意,即使使用 `--test-filter [text]` 命令行参数,也会运行非命名测试(名字为空的测试块)。
Expand Down

0 comments on commit fb33684

Please sign in to comment.