Rust书说,使用"测试"模块是进行单元测试的惯用方法.但是,如果该函数未标记为"pub",我无法在tests模块中看到超级模块的函数.那么如何测试内部函数呢?
我的第一直觉是寻找#ifdef关键字的方法pub.我过去曾为C++测试做过这个.对于Rust,我所做的只是对模块中的私有函数进行测试,然后在"tests"模块中测试公共接口.
我做得对吗?
如果我有
type Foo struct {
// some data
}
func (f *Foo) Op1() bool {
// perform operation and return a bool
}
func (f *Foo) Op2(other int) bool {
// perform a different operation using internal data
// and the passed in parameter(s)
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以存储指向第一个方法的指针。
fn := f.Op1
Run Code Online (Sandbox Code Playgroud)
并称之为
if fn(f) { // do something }
Run Code Online (Sandbox Code Playgroud)
但如果我想对 做同样的事情怎么办Op2?我目前通过定义一个包装函数来伪造它,该函数接受 aFoo和值并调用操作。但这是很多样板代码。
我见过:
并在网上搜索。我不想关闭。我正在尝试实现一个经典的动态(-ish)函数查找表。
mod impl_foo;
mod impl_bar;
use utils;
// a CmdResult is a Result with a tuple of an int and a string
static FUNCTIONS: &'static [fn(&[String]) -> utils::CmdResult] = &[
("bar".to_string(), impl_bar::call_bar),
("foo".to_string(), impl_foo::call),
];
fn find_action(name: &String) -> (fn(&[String]) -> utils::CmdResult) {
match FUNCTIONS.binary_search_by(|item| item[0].cmp(name)) {
Ok(action) => action,
Err(_) => (|&[String]| Err((1, format!("Unknown '{}'", name))))
}
}
// later on in another function ....
Run Code Online (Sandbox Code Playgroud)
动作 = find_action("foo"); 让结果=动作(参数);// 处理结果
但这不能编译:
src/main.rs:44:5: 44:50 error: mismatched …Run Code Online (Sandbox Code Playgroud) 我没看到在哪里s定义.大师不会告诉我.我得到的只是"没有标识符的对象",但它知道k它旁边的权利.以下是链接代码的典型代码段:
func getIndexAndRemainder(k uint64) (uint64, uint64) {
return k / s, k % s
}
Run Code Online (Sandbox Code Playgroud)
一个字母的变量名称肯定会让你更难以找到.我找了通常的嫌疑人:var s uint64,s := ...什么都没有.显然,它需要是某个地方定义的全球价值.
这让我有两个问题:
s来自哪里?编辑:对于其他偶然发现此事的人.
Guru失败了,因为我没有在适当的Go工作区下检查包的源代码,方法是将git clone放在/ some/path/src下并设置GOPATH为/ some/path.因此,虽然我认为GOPATH=. guru definition s会起作用,GOPATH但却被忽略了.大师可以找到,k因为它在文件中,但它不知道如何查看其他文件.
我的grep失败的原因const使用简单=而不是a :=.我将在将来贪图时记住这一点.