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

时间:2018-04-24 17:57:34

标签: c# .net unit-testing design-patterns refactoring

所以,我有以下代码结构

SELECT Columns
  FROM Menu
 WHERE Curtime() BETWEEN Start AND End
    OR (Start > End AND Curtime() NOT BETWEEN End AND Start );

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:1)

首先,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);
    }