我有很多重复测试,我想以某种方式抽象它们。辅助方法很有用,但最重要的是。如果我能以某种方式在我的Specification
中以编程方式生成测试方法,我将能够删除大量的复制粘贴代码。
具体来说,我正在测试RPC层的方法。如果不以某种方式调用它们,大多数方法必须失败。所以我有Spock测试方法,如:
def observer = Mock(StreamObserver)
def rpc = new UserServiceRpc()
def "draftToOutbox: should fail when called without parent"() {
def request = draftToOutboxRequest().toBuilder().clearParent().build()
when:
rpc.draftToOutbox(request, observer)
then:
1 * observer.onError(_)
1 * observer.onCompleted()
}
def "outboxToDraft: should fail when called without parent"() {
def request = outboxToDraftRequest().toBuilder().clearParent().build()
when:
rpc.outboxToDraft(request, observer)
then:
1 * observer.onError(_)
1 * observer.onCompleted()
}
不幸的是,我不熟悉Groovy的元编程(编译时AST转换)功能,并且不确定如何做到这一点,是否有可能,以及这是否是一个好主意。一方面我有一些复制粘贴,但另一方面我的测试非常易读。不过,我倾向于拥有两全其美:没有复制粘贴的可读性。
答案 0 :(得分:6)
在这种情况下,您可以使用Data Driven Testing这样的常规内容:
html, body {
height: 100%;
width: 100%;
}
html {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
*, *:before, *:after {
-moz-box-sizing: inherit;
-webkit-box-sizing: inherit;
box-sizing: inherit;
}
修改强>
使用方法指针的示例:
@Unroll
def "#method: should fail when called without parent"() {
given:
def request = "$methodToGetRequest"().toBuilder().clearParent().build()
when:
rpc."$methodToTest"(request, observer)
then:
1 * observer.onError(_)
1 * observer.onCompleted()
where:
methodToTest | methodToGetRequest
'draftToOutbox' | 'draftToOutboxRequest'
'outboxToDraft' | 'outboxToDraftRequest'
}