gpt4 book ai didi

unit-testing - Grails 单元测试

转载 作者:行者123 更新时间:2023-12-04 05:29:57 25 4
gpt4 key购买 nike

这不是问题,而是关于 grails 中一般单元测试的评论请求。

我一直在努力反对编写单元测试,除了非常非常简单的用异常(exception),我总是遇到一些障碍。我发现任何时候需要模拟一些东西,比如 grailsApplication 或其他一些框架对象,单元测试开始分崩离析,或者你需要跳过太多的环节以致于适得其反。然后,最重要的是,从 1.X 到 2.X 的迁移导致了各种单元/集成测试重构,从长远来看,这使事情变得更容易,但在迁移过程中仍然导致失败。

我的答案...将所有半复杂的测试移到集成测试中,不要回头看。当一切都启动时它会起作用。它需要更长的时间来运行,但不会比处理令人头疼的单元测试更长。

最近的(不是第一个)引起我胃灼热的用例是尝试对创建域对象的服务进行单元测试,该域对象依赖于 grailsApplication.config,并对该域对象执行某些操作。我尝试了所有我发现的修复它的方法(除了实际有效的方法!),但没有任何效果,我将单元测试代码移至集成测试,并且它在第一次运行时通过了。单元测试提示无法在空对象或类似对象上调用“config”,这意味着 grailsApplication 不存在。

当集成测试始终适用于所有情况时,我真的不认为有必要编写单元测试。

使用 grails 2.2.0。

最佳答案

不同意。

单元测试是遵循 TDD 概念的完美编写的应用程序的构建 block 。进行单元测试的基本原理是将模块与注入(inject)隔离开来,并尝试使用测试环境提供的所有依赖项而不是容器提供的依赖项来测试它。

我能理解这里的痛点。您必须完成一些样板设置,但这是进行单元测试的要点。

集成测试为您提供了一切(顶部的依赖注入(inject)),但这并不能解决在隔离条件下测试模块的目的。我一直在和你一样将一堆项目从 Grails 1.3.4 升级到 Grails 2.2.0 并面临同样的问题。但是我花了一些时间来理解最新版本的 Grails 提供的高度灵活的模拟机制。例如;

@Mock :您不再需要使用 mockDomain,注解将负责模拟单元测试用例中的域类。不要忘记build-test-data plugin使模拟更方便

@TestFor:您可以对 grails 工件( Controller 、服务)使用 @TestFor 注释,它会为您进行一些注入(inject),您最终会遵循一些约定。

不要忘记 mixins 的强大功能。

您可以找到更多关于它们的信息 here .

现在回答您在对服务类进行单元测试时遇到的问题。 grailsApplication 在单元测试用例中很容易获得,您不需要 mock 或尝试从应用程序上下文中获取它。只需在测试类中使用 grailsApplication 即可:

//Unit test
void testSomething(){
assert "Hello" == grailsApplication.config.foo.bar.hello
}

//Config.groovy
foo.bar.hello=hello

是不是很简单?切记不要在单元测试类中def grailsApplication

另一方面,如果您正在测试特定的服务,或者测试使用多于模块的服务的一部分,集成测试是更好的方法。

我们让测试失败以便通过。编写一个通过的测试用例让我感到不舒服,并认为我做错了什么。 :)

关于unit-testing - Grails 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17239476/

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