代码之家  ›  专栏  ›  技术社区  ›  Macha

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

  •  2
  • Macha  · 技术社区  · 15 年前

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

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

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

    但是我想知道,如果某个东西不返回或者仅仅返回一个状态代码,这将如何工作。

    4 回复  |  直到 15 年前
        1
  •  2
  •   Jon Skeet    15 年前

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

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

        2
  •  1
  •   Jacob Mattison    15 年前

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

        3
  •  1
  •   S.Lott    15 年前

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

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

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

    在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 )
    
        4
  •  0
  •   Vadim    15 年前

    有许多不同的情况:

    案例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 examples .