Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 单元测试程序(与功能相反)_Unit Testing - Fatal编程技术网

Unit testing 单元测试程序(与功能相反)

Unit testing 单元测试程序(与功能相反),unit-testing,Unit Testing,我是单元测试新手,我想知道如何对一个过程(在本例中是一个过程)进行单元测试一个“做某事”而不是“返回某事”的函数 我知道,测试返回答案的函数的一般思想是 assert(yourfunction(sample, inputs) == expected_answer); 但我想知道,如果某个对象不返回或仅返回状态代码,这将如何工作。您需要能够测试它的功能。例如,您的过程是否向集合中添加了内容?设置属性?创建文件 不管是什么,变化可能是以某种方式可见的。你只需要找出如何检查这种效果。当然,有时说起来

我是单元测试新手,我想知道如何对一个过程(在本例中是一个过程)进行单元测试一个“做某事”而不是“返回某事”的函数

我知道,测试返回答案的函数的一般思想是

assert(yourfunction(sample, inputs) == expected_answer);

但我想知道,如果某个对象不返回或仅返回状态代码,这将如何工作。

您需要能够测试它的功能。例如,您的过程是否向集合中添加了内容?设置属性?创建文件


不管是什么,变化可能是以某种方式可见的。你只需要找出如何检查这种效果。当然,有时说起来容易做起来难,这就是为什么功能方法在合适的时候更容易测试的原因:)特别是修改外部资源(文件系统、数据库等)的效果依赖于外部资源的效果(同上)比那些仅以相当“局部”的方式改变事物的效果更难测试。

在某些情况下,过程所做的是对其他依赖项调用方法。在这种情况下,如果使用依赖项注入方法,则可以传入这些依赖项的模拟,并使用断言或期望来确保使用正确的参数对依赖项调用正确的方法。

对于过程,“做点什么”通常涉及API调用或其他对象操作

例如,一个过程可以将一行写入一个文件。它使用文件I/OAPI调用(或文件IO对象)来“写一行”

您要做的是创建“mock”对象来代替文件。Mock对象具有足够的功能来收集测试结果并使它们对断言可见。不要覆盖你的模拟对象,这是一个浪费时间的老鼠洞

在Python中,我们做的事情如下

class MockFile( object ):
    def __init__( self, aFileName, aMode ):
        self.name= aFileName
        self.mode= aMode
        self.buffer= None
    def write( self, aRow ):
        self.buffer= str(aRow)
现在我们可以将这个模拟文件提供给我们的过程,而不是真正的文件。我们可以断言发生了什么

class TestSomeProcedure( unittest.TestCase ):
    def testWrite( self ):
        mockFile= MockFile( "name", "w" )
        theProcedureImTesting( args, args, args, mockFile )
        self.assertEquals( "The Row It Was Supposed to Write\n", mockFile.buffer )

有许多不同的情况:

案例1:

    public class A
    {
      public void Foo()
      {
        Init();
      }

      protected virtual void Init()
      {
        Do something;
      }
    }

    [TestFixture]
    public class ATests
    {
      [Test]

      public void Foo_test()
      {
         A aStub = new A_Stub();
         aStub.Foo();
         Assert.IsTrue(aStub.wasInit);
      }

       public class A_Stub : A
       {
          public bool wasInit;

          protected override void Init()
          {
            wasInit = true;
          }
       }
  }
案例2: 当您的方法依赖于另一个对象而不是执行属于同一类的成员时。在这种情况下,我建议使用模拟框架。我个人使用Rhino.Mocks。您可以按照此链接查看