在TDD期间如何测试以下场景

时间:2017-11-07 06:02:31

标签: unit-testing tdd moq

尝试采用TDD进行开发,但在某些情况下我不是最好的选择,如何编写代码并测试它们。

以下是代码方案:

  1. 有一个公共方法说Initialize(),它只初始化类的私有成员。如果工作正常或不工作,如何测试此方法。

  2. 有一个私有方法说DoSomething(),并且由同一类Caller1()和Caller2()的2个公共方法调用。在为这两种方法编写单元测试时,我无法模拟DoSomething(),因为它是私有的,但是这个方法代码将被测试两次。 如何在这种情况下编写代码/测试?

  3. 有一个公共方法DoSomething()被另一个公共方法Caller()调用。 DoSomething()初始化一个私有成员,然后在Caller()中使用。我可以在测试Caller()时模拟DoSomething(),但是无法在私有成员中设置数据。 如何在这种情况下编写代码/测试?

  4. 如果我遇到任何情况,我会更新更多场景。

2 个答案:

答案 0 :(得分:1)

  

有一个公共方法说Initialize(),它只初始化私有   班级成员。如果它正常工作或如何测试此方法   不

在调用您正在测试的实际方法之前,在调用Initialize方法的测试中编写其他公共方法的测试,并断言其他公共方法正常工作。未调用Initialize方法或其实施错误时,测试失败。

  

有一个私有方法说DoSomething()并且被2调用   相同类Caller1()和Caller2()的公共方法。在写单元的同时   测试这两种方法我不能模拟DoSomething(),因为它   私有,但这个方法代码将被测试两次。怎么写   这种情况下的代码/测试?

使用TDD - 测试第一种方法,您不应该使用私有方法DoSomething。您为方法Caller1Caller2编写测试,然后当所有必需的测试通过时,您会注意到实现有一些重复并通过引入私有方法DoSomething来重构它。它的实施测试了两次 - 你可以拥有"双重安全网"。

  

有一个公共方法DoSomething()被称为表单   另一个公共方法Caller()。 DoSomething()初始化私有   然后在Caller()中使用的成员。我可以嘲笑DoSomething()   测试Caller()但无法在私有中设置数据   会员。如何在这种情况下编写代码/测试?

与第一种情况相同。您在测试中调用这两个方法并断言Caller方法正常工作。如果未调用Initialize方法或其实施错误,您的测试将失败。

答案 1 :(得分:0)

TDD有3条法律:

  
      
  1. 如果没有首先编写失败的测试,则不允许编写任何生产代码,因为生产代码不存在。
  2.   
  3. 你不能写更多的测试而不是足以失败;包括编译失败。
  4.   
  5. 您不得编写足以通过当前失败测试的生产代码。
  6.   

围绕法律的循环是RED-GREEN-REFACTOR,其中一个主要思想是通过多个简单的用例(测试)发现您的生产代码

如果我们遵守法律:

  1. (RED)我们编写了第一个用例,我们将我们的类和方法命名为我们希望它被命名并且你期望
  2. 示例:

    var foo = new Foo()
    expect(foo.initialize()).toEqual(false)
    
    1. (RED)我们启动测试,但我们不能!也许,IDE说我们(哼,我不知道这个类)所以我们创建了类和方法
    2. (绿色)我们编写了通过测试的最小代码。代码可能非常难看!这一步的目标是在我们进行重构步骤后通过测试
    3. 示例:

      class Foo {
        initialize() {
          return false
        }
      }
      
      1. (REFACTOR)在绿色测试后立即重构我们的生产代码
      2. (REFACTOR)我们再次启动测试;如果它是绿色的,一切都很好。它是红色的,我们检查重构。然后返回1直到功能完成。
      3. 为什么每次重构都如此重要?因为我们重构了我们刚写的代码。我们知道它的作用。

        所以,在重构阶段,你在这里发现你是否需要私有方法。如果你有,那么在第5步启动的测试会隐式检查它。

        您可以阅读这些文章:http://blog.cleancoder.com/uncle-bob/2017/03/07/SymmetryBreaking.htmlhttp://blog.cleancoder.com/uncle-bob/2014/12/17/TheCyclesOfTDD.html

        关于TDD有很多好的内容:你可以和Ian Cooper或Bob叔叔(Robert C. Martin)一起观看视频

相关问题