重构单元测试代码的实践

Rei*_*aka 4 c# testing unit-testing

假设我有这样的函数:

public void AddEntry(Entry entry)
{
    if (entry.Size < 0)
        throw new ArgumentException("Entry size must be greater than zero");
    DB.Entries.Add(entry);
}
Run Code Online (Sandbox Code Playgroud)

并进行相应的单元测试:

[TestMethod]
[ExpectedException(typeof(ArgumentException), "Entry size must be greater than zero")]
public void AddEntry_TermSizeLessThanZero_ThrowException()
{
    Entry e = new Entry(-5);

    AddEntry(e);
}
Run Code Online (Sandbox Code Playgroud)

然后我重构验证码:

public void AddEntry(Entry entry)
{
    Validate(entry);
    DB.Entries.Add(entry);
}

public void Validate(Entry entry)
{
    if (entry.Size < 0)
        throw new ArgumentException("Entry size must be greater than zero");
}
Run Code Online (Sandbox Code Playgroud)

单元测试不再描述验证代码.

在这种情况下,最好的做法是什么?我是否只是通过AddEntry离开Validate()进行测试?

编辑:澄清一下,假设我有理由将折射代码公开(在这种情况下有点做作),我想复制测试代码是否彻底?

Joh*_*lph 6

由于您使Validate()方法成为对象的公共成员(无论出于何种原因),您当然应该为它添加单独的测试.测试AddEntry应保持不变.

单元测试应仅测试单元的接口,不应假设任何实现细节.因此,在这种情况下,您应该按原样保留测试AddEntry,因为它描述了接口的行为.但你不应该假设或测试那些AddEntry()电话Validate().