gpt4 book ai didi

php - SUT - 测试内部行为 TDD

转载 作者:行者123 更新时间:2023-11-28 21:27:36 27 4
gpt4 key购买 nike

我对测试要求有疑问。

举个例子:

Class Article {

public void deactive() {//some behaviour, which deactives article}

}

我的要求是,该文章可以停用。我将把它作为我的 Article 类的一部分来实现。

测试将调用deactive 方法,但是现在呢?我需要在测试结束时检查是否满足要求,因此我需要实现方法 isDeactived
这是我的问题,如果我真的应该这样做?此方法将仅由我的测试用例使用,不会用于其他地方。所以我使我的类接口(interface)复杂化,只是为了查看断言,如果真的停用了。

什么是正确的实现方式?

最佳答案

通常认为可以向类添加测试 Hook 。最好有一个稍微杂乱的界面,并且知道你的类是有效的,而不是让它无法测试。但是还有其他一些解决方案。

如果您可以让您的方法 protected 或包私有(private),您可以使用类似 Guava's @VisibleForTesting annotation 的东西. Java 以外的语言可能有其他类似的库。

您还可以继承 Article 以访问私有(private)字段。

class ArticleTest extends Article {
@Test
public void deactiveTest() {
this.deactive();
assertTrue(this.isDeactive);
}
}

这一切都假设您有一些字段用于标记对象是否处于事件状态。

可能是您导致了一些副作用,例如调用数据库,以及一些服务表明您正在停用该文章。如果是这样,您应该模拟您用来产生副作用的协作者并验证您是否正确调用了它们。

例如(在 java/mockito 中类似伪代码):

@Test
public void deactiveTest() {
Article underTest = new Article(databaseMock, httpMock); //or use dependency injection framework of your choice...
underTest.deactive();
verify(databaseMock).calledOnce().withParams(expectedParams);
verify(httpMock).calledOnce().withParams(expectedParams);
}

最后一种可能性,如果该字段影响某些其他方法或函数的行为,您可以尝试(再次使用伪代码):

article.deactive()
result = article.post() // maybe returns true if active, else false?
assertFalse(result)

这样,您就可以测试结果行为,而不仅仅是检查内部状态。

关于php - SUT - 测试内部行为 TDD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35118694/

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