0

我真的不明白如何编写“独立”行为测试。

EG 用户可以将地址添加到地址簿。

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

或者如果我深入数据库进行验证,那不是将“行为”与实现联系起来吗?

4

1 回答 1

1

听起来您在某个时候将地址保存到数据库中,这意味着要么

a)地址簿需要以某种方式公开添加的地址 - 通过“GetAddresses”方法或“AddedAddresses”公共属性 - 以便它们可以被其他对象拾取和保存(听起来很可能来自你说); 或者

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

如果是 a),那么您需要调用该方法或属性以确保已按预期添加地址。如果是 b),那么您可以向地址簿提供一个虚假的数据访问类,公开该虚假的公共属性,调用地址簿上的“保存”方法,并对虚假的公共“地址”属性进行验证数据访问类,如下所示:

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

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

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

但无论哪种方式,您都需要调用其他东西(因此可能会争辩说您正在测试另一个构造)以验证您想要验证的内容是正确的。

就个人而言,如果是我,我会在地址簿上放置一个公共的“地址”属性。

于 2012-12-28T11:04:39.193 回答