使方法可测试单元测试c#

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使方法可测试单元测试c#相关的知识,希望对你有一定的参考价值。

所以,我有以下代码结构

public void method1(int index)
{
   switch(index)
   {
       case 1:
           Method2();break;
       case 2:
            Method3();break;
   }
 }

 public void Method2()
 {
     var entity = new SomeEntity();
     repo.Add(entity);

     var anotherEntity= new AnotherEntity();
     repo.Update(anotherEntity);
 }

在使用单元测试覆盖method2时,我遇到了问题,如果我想检查该实体是否添加到db,无论如何它也会运行更新方法。我怎么能以某种方式拆分它,只是想得到一些方法的最佳实践,在这种方法中需要用db做多个操作。谢谢你的帮助!

答案

在测试中,您只需要测试对象的行为。 在您的情况下,您的对象的行为是添加一个实体并更新另一个实体。 对象具有负责此行为的公共方法Method2

所以你最后得到两个测试,一个用于更新,一个用于添加。您可以模拟存储库并测试使用预期参数调用的方法AddUpdate。或者如果你可以使用“InMemory”数据库并且还有覆盖持久层的测试会更好。

Update也可以在Add的测试中执行,你只会断言Add的行为而忽略Update方法。

您的问题与单一责任原则无关。单一责任原则意味着对象应该只有一个改变的理由。

在您的情况下,如果更新另一个实体是添加另一个实体的逻辑的一部分 - 它应该保留在一个类/方法中并进行整体测试。

另一答案

首先,Method2()违反了SOLID的单一责任原则

单一责任原则:一个类应该只有一个责任(即只更改软件规范的一部分应该能够影响类的规范)。

这些操作需要采用自己的方法,这样做会导致:

  • 更好的可维护性
  • 编写单元测试的更好选择。 public void Method2() { //This method only adds new entities var entity = new SomeEntity(); repo.Add(entity); } public void Method3() { //This method only updates entities var anotherEntity= new AnotherEntity(); repo.Update(anotherEntity); }

以上是关于使方法可测试单元测试c#的主要内容,如果未能解决你的问题,请参考以下文章

[转] 单元测试详解

如何编写具有可测试性的代码

设计模式简记-通过重构增强代码可测试性实战

设计模式简记-通过重构增强代码可测试性实战

如何提高软件的可测试性?

单元测试在C#,Moq中调用SAP异步Web服务