2012-12-28 120 views
0

我真的不知道如何编写“独立”行为测试。如何编写独立功能测试

E.G.用户可以将地址添加到地址簿。

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

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

回答

0

这听起来像你节省下来到在某一时刻数据库中的地址,这意味着无论是

一)地址簿需要公开的附加地址以某种方式 - 通过无论是“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 

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

但无论如何,你是对的,你需要调用别的东西(因此可能会争辩说你正在测试另一个构造),以验证你想要验证的内容。

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

+1

这是比功能测试更多的单元测试吗?我正在谈论的东西更多的是托管应用程序和发布数据到一个页面的行,只是为了确保整个应用程序的工作。 –

+0

您正在讨论集成测试,在这种情况下,您应该将一些已知输入放入您提到的用于调用该过程的页面中,读取数据库结果并验证它们是您期望的内容,然后自行清理即从数据库中删除数据)。为了回答你最初的问题,测试“实现”正是集成测试的目的,所以在这种情况下,做到这一点并且不会感觉不好。 –