2014-04-17 137 views
1

如果我有一个结构,如:如何单元测试结构构造

struct Foo { 
    bar: int, 
    baz: bool 
} 

和默认的构造函数,如:

impl Foo { 
    fn default() -> ~Foo { 
    Foo{bar: 0, baz: false} 
    } 
} 

我想一个单元测试,我的构造函数:

#[test] 
fn test_foo_default() { 
    let foo1 = Foo::default(); 
    let foo2 = ~Foo{bar: 0, baz: false}; 
    // What to put here to compare them? 
} 

如何轻松比较两个结构以确保它们在内容,类型和所有权方面相同?

回答

1

让编译器派生Foo的Eq特征(如果可能的话),然后检查与assert_eq!宏是否相等。该宏还需要Show才能被实现,所以让我们来推导它。您的原始默认()函数实际上不会编译,因为它试图返回一个Foo,其中~Foo已被承诺。 Foo~Foo实际上是不同的类型,但您可以取消引用~Foo并进行比较。

您可能还对Default特性感兴趣。

#[deriving(Eq,Show)] 
struct Foo { 
    bar: int, 
    baz: bool 
} 

impl Foo { 
    fn default() -> ~Foo { 
     ~Foo{bar: 0, baz: false} 
    } 
} 

#[test] 
fn test_foo_default() { 
    let foo1 = Foo::default(); 
    let foo2 = ~Foo{bar: 0, baz: false}; 
    assert_eq!(foo1,foo2); 
} 

#[test] 
fn test_foo_deref() { 
    let foo1 = Foo::default(); 
    let foo2 = Foo{bar: 0, baz: false}; 
    assert_eq!(*foo1,foo2); 
} 
+0

这很好用,直到我有一个指向特征的结构体,然后它不再可以派生Eq或Show。 –