尝试采用TDD进行开发,但在某些情况下我不是最好的选择,如何编写代码并测试它们。
以下是代码方案:
有一个公共方法说Initialize(),它只初始化类的私有成员。如果工作正常或不工作,如何测试此方法。
有一个私有方法说DoSomething(),并且由同一类Caller1()和Caller2()的2个公共方法调用。在为这两种方法编写单元测试时,我无法模拟DoSomething(),因为它是私有的,但是这个方法代码将被测试两次。 如何在这种情况下编写代码/测试?
有一个公共方法DoSomething()被另一个公共方法Caller()调用。 DoSomething()初始化一个私有成员,然后在Caller()中使用。我可以在测试Caller()时模拟DoSomething(),但是无法在私有成员中设置数据。 如何在这种情况下编写代码/测试?
如果我遇到任何情况,我会更新更多场景。
答案 0 :(得分:1)
有一个公共方法说Initialize(),它只初始化私有 班级成员。如果它正常工作或如何测试此方法 不
在调用您正在测试的实际方法之前,在调用Initialize
方法的测试中编写其他公共方法的测试,并断言其他公共方法正常工作。未调用Initialize
方法或其实施错误时,测试失败。
有一个私有方法说DoSomething()并且被2调用 相同类Caller1()和Caller2()的公共方法。在写单元的同时 测试这两种方法我不能模拟DoSomething(),因为它 私有,但这个方法代码将被测试两次。怎么写 这种情况下的代码/测试?
使用TDD - 测试第一种方法,您不应该使用私有方法DoSomething
。您为方法Caller1
和Caller2
编写测试,然后当所有必需的测试通过时,您会注意到实现有一些重复并通过引入私有方法DoSomething
来重构它。它的实施测试了两次 - 你可以拥有"双重安全网"。
有一个公共方法DoSomething()被称为表单 另一个公共方法Caller()。 DoSomething()初始化私有 然后在Caller()中使用的成员。我可以嘲笑DoSomething() 测试Caller()但无法在私有中设置数据 会员。如何在这种情况下编写代码/测试?
与第一种情况相同。您在测试中调用这两个方法并断言Caller
方法正常工作。如果未调用Initialize
方法或其实施错误,您的测试将失败。
答案 1 :(得分:0)
TDD有3条法律:
- 如果没有首先编写失败的测试,则不允许编写任何生产代码,因为生产代码不存在。
- 你不能写更多的测试而不是足以失败;包括编译失败。
- 您不得编写足以通过当前失败测试的生产代码。
醇>
围绕法律的循环是RED-GREEN-REFACTOR,其中一个主要思想是通过多个简单的用例(测试)发现您的生产代码
如果我们遵守法律:
示例:
var foo = new Foo()
expect(foo.initialize()).toEqual(false)
示例:
class Foo {
initialize() {
return false
}
}
为什么每次重构都如此重要?因为我们重构了我们刚写的代码。我们知道它的作用。
所以,在重构阶段,你在这里发现你是否需要私有方法。如果你有,那么在第5步启动的测试会隐式检查它。
您可以阅读这些文章:http://blog.cleancoder.com/uncle-bob/2017/03/07/SymmetryBreaking.html和http://blog.cleancoder.com/uncle-bob/2014/12/17/TheCyclesOfTDD.html
关于TDD有很多好的内容:你可以和Ian Cooper或Bob叔叔(Robert C. Martin)一起观看视频