c#单元测试功能

时间:2018-07-25 03:39:08

标签: c# unit-testing

我有类似的功能

public void UpdateData()
{
  Data data = GetDataFromDatabase()

  if(!data.IsDefault)
  {  
   // Do some change in data object
     SaveData(data);
  }
}

我想为SaveData(Data data)函数编写单元测试,

public bool SaveData(Data data)
{
  // Code for saving data in database
}

以上功能包含用于将数据保存到数据库中的代码,并且没有验证。验证在调用此函数之前完成。

应用程序要求是默认数据不应更新。因此,在编写单元测试时,我应该考虑这一要求吗?

如果我这样写单元测试,

public void SaveData_DefaultData()
{
   SaveData(defaultData);
   Assert.IsTrue(); // Some condition in assert to check whether the default data is updated.
}

通过查看SaveData函数,我知道此测试用例将失败。 所以我的问题是我需要考虑这个测试用例吗?

3 个答案:

答案 0 :(得分:1)

是的,必须测试任何public类。为此,您需要通过以下方式测试您的对象:

    public interface ITest
   {
      bool SaveData(Data data);
   }

因此创建一个假对象,以将方法导出到将我们的方法发送到数据库的逻辑中

 public class FakeTest : ITest
 {
    public bool SaveData(Data data)
    {
       \\Fake Code Return so Like : return true;
    }
 }

因此创建MsTest或NUnit用于测试

 namespace MsTest
  {
      [TestClass]
      public Class TestDataBase 
      {
           [TestMethod()]
           public void SendTest()
           {
             Mock<ITest> smtpClient = new Mock<ITest>();
             var DataBase = new DataBase(smtpClient.Object);
             bool save = DataBase.SaveData(New Data());
             Assert.IsTrue(save);
        }
      }
  }

答案 1 :(得分:1)

编写单元测试的一个非常重要的事情是测试应该在类的上下文中验证行为。在这种情况下,SaveData方法实际上将转到数据库并在那里进行更改。它比单元测试更像是集成测试。在某些情况下,测试可能会由于网络或其他问题而失败,但是您的课程可以按预期正常运行。

理想情况下,对于UT超出类范围的情况,您应该在适当的位置添加依赖项注入,以便您的类应该能够为UT使用不同的实现。然后,您应该使用Moq之类的模拟框架来提供UT执行期间的期望。

您想了解更多有关上述设计hereherehere的信息。

答案 2 :(得分:0)

我会假设,如果您要引用默认数据,则默认数据应始终保留在数据库中(包括单元测试数据库),因此永远不需要使用defaultData执行SaveData。现在,如果您的单元测试要断言未更新默认数据,那么我可能建议单元测试触发一些将数据插入DB并断言默认数据保持不变的东西。

像上面的测试用例似乎没有测试任何东西。您的保存数据将插入/更新默认数据(无论如何),除非您的数据库明确阻止该操作,否则保存数据将成功并且正确。但在您的系统方面不正确。

仅当您的数据库阻止更新默认数据时,这才是适当的测试。 (以我的拙见)