提供者状态

契约中的各个交互应该是在互相隔离状态下进行验证的,不得持有前一个交互中的上下文。依赖于之前测试产出结果的测试将会是脆弱的,而且会将你重新陷入到集成测试的泥潭中,而这正是想通过使用契约测试来极力摆脱的困境。

那么怎样测试那些依赖于提供者中已存在的数据的请求呢?提供者状态允许你在交互发生前就可以向数据源注入数据,实现对提供者预置数据,这样就可以生成与消费者期望相匹配的响应了。消费者状态的名字是在消费者交互中使用given语句指定的,然后用于寻找在提供者中运行的代码块,以设置正确的数据。如果需要对下游系统打桩,或者返回正常情形下难以产生的响应(比如500错误),这里也可以用于设置打桩。

提供者状态也可以允许消费者对同一请求测试不同的期望响应(例如不同的响应码,或者同一资源的不同数据子集)。

请记住提供者状态都是关于提供者的状态的(例如,有什么样的数据,怎样处理所得到的响应),而不是关于消费者状态的,也不是关于请求中有哪些东西的。

关于如何在代码中玩转这些,请参考Ruby例程