【发布时间】:2018-07-20 02:39:30
【问题描述】:
NUnit 是一个 C# 单元测试框架,允许您编写如下代码:
Assert.That(someInt, Is.EqualTo(42));
Assert.That(someList, Has.Member(someMember));
我喜欢这种代码,因为它看起来像英文,很容易阅读。
我正在玩 Rust,看看我是否可以创建一个提供相同感觉的库:
use std::fmt::Debug;
struct Is;
enum Verb<T> {
EqualTo(T),
}
impl Is {
fn equal_to<T>(&self, obj: T) -> Verb<T> {
Verb::EqualTo(obj)
}
}
#[allow(non_upper_case_globals)]
const is: Is = Is{};
fn assert_that<T: Eq + Debug>(obj: T, verb: Verb<T>) {
match verb {
Verb::EqualTo(rhs) => assert_eq!(obj, rhs),
}
}
fn main() {
assert_that(42, is.equal_to(42));
assert_that(42, is.equal_to(0));
}
这很好,但一方面:当代码在assert_that(42, is.equal_to(0)) 发生恐慌时,恐慌给出的行是assert_eq!(obj, rhs) 的行(即在库中而不是用户的代码)。我知道这种行为是正常的,但我会收到更有用的信息。
panic中如何指示正确的行号?
【问题讨论】:
-
我认为如果您将
assert_that更改为宏,它可能会显示正确的行。不确定。
标签: unit-testing rust