如何编写独立的功能测试

时间:2012-12-28 04:16:21

标签: tdd bdd

我真的不知道怎么写“独立”的行为测试。

E.G。用户可以在地址簿中添加地址。

所以我有一本地址簿课。我写了一个测试来添加一个地址。但是如何在不调用“显示地址”方法的情况下验证地址是否成功写入?当我调用“显示地址”方法时,我依赖于显示方法的功能和工作。即便如此,是不是在一次测试中测试两种行为?

或者,如果我深入数据库进行验证,是不是将“行为”与执行相关联?

1 个答案:

答案 0 :(得分:0)

听起来你在某个时候将地址保存到数据库,暗示要么

a)地址簿需要以某种方式公开添加的地址 - 通过" GetAddresses"方法,或者" AddedAddresses"公共财产 - 所以他们可以被其他一些物体拾起并保存(听起来很可能来自你所说的);或

b)你有某种" Save"触发地址簿类的方法,该方法触发将地址保存到数据库的操作,这意味着在地址簿类中,您依赖于某些其他对象,例如存储库或数据访问类。

如果a),则需要调用该方法或属性以确保按预期添加地址。如果b),那么你可以向地址簿提供一个假的dataaccess类,在那个假的上面公开一个公共财产,调用" Save"地址簿上的方法,并对公众进行验证"地址"伪数据访问类的属性,如下所示:

(你没有提到语言所以这只是伪代码)

class addressbook

    private _dataAccess
    private addresses

    constructor (dataaccess) _dataAccess = dataAccess

    public method AddAddress(address) addresses.add(address)

    public method save() _dataaccess.save(addresses)



class fakedataaccess

    public addresses

    public method save(addresses) addresses = addresses


{test}
public test AddingAddressesWorks

    fake = new fakedataaccess
    book = new addressbook(fake)

    // Do stuff to add addresses to addressbook

    book.save

    assert fake.addresses == the_addresses_i_added

希望这是有道理的。你也可以通过模拟实现这一点,但这超出了我的伪代码范围,并且概念无论如何都是一样的。

但不管怎样,你是对的,你需要调用别的东西(因此可能会说你正在测试另一个构造)以验证你想要验证的内容。

就个人而言,如果是我,我会把公众"地址"地址簿上的财产。