gpt4 book ai didi

unit-testing - 在使用模拟对象时,如何防止我的单元测试需要有关实现内部的知识?

转载 作者:行者123 更新时间:2023-12-01 16:04:46 24 4
gpt4 key购买 nike

我仍处于关于单元测试的学习阶段,特别是关于模拟(我正在使用 PascalMockDUnit 框架)。我现在偶然发现的一件事是,我找不到将测试类/接口(interface)的实现细节硬编码到我的单元测试中的方法,这感觉不对……

例如:我想测试一个类,它实现了一个非常简单的接口(interface),用于读取和写入应用程序设置(基本上是名称/值对)。呈现给消费者的界面完全不知道值的实际存储位置和方式(例如注册表、INI 文件、XML、数据库等)。自然地,访问层是由一个不同的类实现的,该类在构造时被注入(inject)到测试的类中。我为这个访问层创建了一个模拟对象,现在我能够完全测试接口(interface)实现类,而无需实际读取或写入任何注册表/INI 文件/任何内容。

但是,为了确保模拟对象在被测试类访问时的行为与真实对象完全一样,我的单元测试必须通过非常明确地定义预期的方法调用和被测类预期的返回值来设置模拟对象。这意味着如果我必须更改访问层的接口(interface)或测试类使用该层的方式,我还必须更改内部使用该接口(interface)的类的单元测试,即使 我实际测试的类的接口(interface) 根本没有改变。这是我在使用模拟时必须忍受的事情,还是有更好的方法来设计可以避免这种情况的类依赖关系?

最佳答案

to ensure the mock behaves exactly like the real thing when accessed by the tested class, my unit tests have to set up the mock object by very explicitly defining expected method calls and the return values expected by the tested class.



正确的。

changes to the interface of the access layer or to the way that the tested class uses that layer I will also have to change the unit tests



正确的。

even though the interface of the class I'm actually testing hasn't changed at all.



“实际测试”?你的意思是暴露的接口(interface)类?没关系。

“测试”(接口(interface))类使用访问层的方式意味着您已将内部接口(interface)更改为访问层。接口(interface)更改(甚至是内部更改)需要测试更改,如果您做错了什么,可能会导致损坏。

这没什么错。事实上,关键是访问层的任何更改 必须需要更改模拟以确保更改“有效”。

测试不应该是“健壮的”。应该是脆的如果您做出改变内部行为的更改,那么事情可能会破裂。如果你的测试太健壮,他们就不会测试任何东西——他们只会工作。这是错误的。

测试应该只在完全正确的原因下工作。

关于unit-testing - 在使用模拟对象时,如何防止我的单元测试需要有关实现内部的知识?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3448121/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com