在 Web 集成测试中,页面对象预期会作为某些操作的结果返回其他页面对象。例如,aLoginForm.submit()
可能在成功时返回CustomerDashboard
页面对象或LoginFailed
在失败时返回对象。
我难以理解的是当系统不是那么确定时会发生什么。例如Order.submit()
可能会导致一个OrderProcessing
页面,或者一个OrderProcessed
页面。处理这种情况的最佳方法是什么?是否应该Order.submit()
返回一个可能的 PageObjects 元组,然后在单个测试中处理?这里推荐的方法是什么?
使用扩展的问题陈述进行更新
想象一下,您有一个接受订单的购物系统。提交订单时,系统可能会立即处理订单,也可能会将订单放入队列中。最终,排队的订单得到处理。在 Rubyish 伪代码中,负责测试的页面对象对象是:
class ProcessedOrderPage < PageObject
item order_id;
item delivery_date;
end
class QueuedOrderPage < PageObject
item orderInQueue;
end
class OrderPage < PageObject
def submit_order_for_immediate_processing
return ProcessedOrderPage.new
end
def submit_order_for_queued_processing
return ProcessingOrderPage
end
end
因此,在我们的测试中,我们可以执行以下操作:
processed_page = orderPage.submit_for_immediate_processing
assert_not_nil processed_page.order_id
或者我们可以测试其他场景:
queued_page = orderPage.submit_for_queued_processing
assert_not_nil queued_page.orderInQueue
这里的想法是我们确切地知道预期的行为,因此我们可以调用返回预期页面对象的帮助程序。事实上,这在这个关于 SO的问题中得到了很好的描述。
我正在尝试处理行为不是那么确定的情况。想象一下,上面submit_for_immediate_processing
和 submit_for_queued_processing
上面被折叠成一个方法,submit_for_processing
并且行为是由系统的运行时属性决定的。也就是说,订单要么立即处理,要么放入队列中。从测试的角度来看,这种行为并不理想,但它就是这样。我想了解谁负责确定此submit_for_processing
方法的结果。在这种特殊情况下,无论如何我对“排队”状态并不感兴趣。我想到达处理订单的地方,所以我可以验证各种订单属性。