我真的不明白如何编写“独立”行为测试。
EG 用户可以将地址添加到地址簿。
所以我有一个地址簿类。我写了一个测试来添加一个地址。但是如何在不调用“显示地址”方法的情况下验证地址是否写入成功?当我调用“显示地址”方法时,我取决于显示方法是否正常工作。即便如此,这不是在一次测试中测试两种行为吗?
或者如果我深入数据库进行验证,那不是将“行为”与实现联系起来吗?
听起来您在某个时候将地址保存到数据库中,这意味着要么
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
希望这是有道理的。您也可以通过模拟来实现这一点,但这超出了我的伪代码的范围,无论如何概念都是一样的。
但无论哪种方式,您都需要调用其他东西(因此可能会争辩说您正在测试另一个构造)以验证您想要验证的内容是正确的。
就个人而言,如果是我,我会在地址簿上放置一个公共的“地址”属性。