gpt4 book ai didi

unit-testing - 使用 GORM 函数对域对象进行单元测试 grails

转载 作者:行者123 更新时间:2023-12-02 13:46:37 25 4
gpt4 key购买 nike

我在 Grails 上的 Groovy 中名为 OrderService 的服务类中有以下代码段。我想为这个类做一个单元测试。 User 和 Order 是域分类的。一个用户有很多订单。

boolean testfun(long userId, lond orderId){

User user = User.findByUserId(userId)
if(user == null)return false
Order order = Order.findByUserAndId(user, orderId)
if(order == null)return false

return true
}

我尝试编写的单元测试如下(使用 Spock):
@TestFor(OrderService)
@Mock([User, Order])
class OrderServiceSpec extends Specification{
def "test funtest"() {

User user = new User(2)
Order order = new Order()
order.metaClass.id = 3// I want to assign the id of the order in domain
order.save()
user.addToOrders(order)
user.save()

expect:
service.testfun(2,3) == true
}
}

但是,此测试失败,因为订单为空。谁能帮我?
另一个问题是:这个测试是单元测试吗?还是我应该在 grails 中编写集成测试?

最佳答案

这取决于您实际尝试测试的内容,但这可以是一个单元测试——我只是建议稍微修改它以仅隔离您有兴趣测试的服务方法。您根本不打算测试域类,因此最好模拟/ stub 测试服务功能所需的行为。

一个很好的方法是使用 Spock 对 interaction based testing 的支持。通过模拟对象。基本上我们指定当服务的 testfun()方法被调用,我们期望 User.findById()被调用一次和 Order.findByUserAndId()也被调用一次。 Spock 然后允许我们对每个方法调用进行 stub ,以便我们指定我们希望方法返回的内容。当我们运行测试时,将使用 stub ,而不是实际的 GORM 方法。

一些复杂性在于剔除静态方法(如 GORM 方法),但您可以使用 GroovySpy完成工作。

另外,我假设您打算使用 User.findById()而不是 User.findByUserId() ?

沿着这些路线的东西应该适合你:

def "test funtest"() {
setup:
// Global so that it replaces all instances/references of the
// mocked type for the duration of the feature method.
GroovySpy(User, global: true)
GroovySpy(Order, global: true)

when:
def result = service.testfun(2,3)

then:
// No need to return real objects, so use a mock
1 * User.findById(2) >> Mock(User)
1 * Order.findByUserAndId(_ as User, 3) >> Mock(Order)
result == true

when:
result = service.testfun(2,3)

then:
1 * User.findById(2) >> null
result == false
}

请注意,我们已经隔离了服务方法。任何协作对象(用户和订单)仅通过 stub 进行交互,我们可以测试服务方法的功能,而无需担心 GORM。

关于unit-testing - 使用 GORM 函数对域对象进行单元测试 grails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35017991/

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