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

我需要测试助手/设置方法吗?

  •  3
  • jpoh  · 技术社区  · 17 年前

    private D GetInstanceOfD(string param1, int param2)
    {
        A a = new A();
        B a = new B();
        C c = new C(a,b, param1);
    
        return new D(c, param2);
    }
    

    这只是一个方便的辅助方法,我可以调用它来抓取我需要的特定对象,而不是记住我需要连接哪些依赖关系来获得我需要的对象。

    D d = new (new C(new A(), new B(), "string"), 1024);
    
    5 回复  |  直到 17 年前
        1
  •  1
  •   tvanfosson    17 年前

    要回答你的第一个问题,是的,你应该测试这种方法。测试这种方法所需的工作量比写整篇文章要少得多,并且可以验证发货代码。

    这取决于你打算让方法做什么

    • 如果我为第一个参数传递null会发生什么?
    • 在您所期望的情况下,GetInstanceOfD是否真的返回了D?
    • D是否具有给定输入的正确值。
    • 假设C、A和B实例是可访问的,那么它们呢?
        2
  •  3
  •   JaredPar    17 年前

    .

    设置方法需要简单。拆卸方法需要简单。辅助方法可以是非平凡的——如果它们有自己的测试集。

    如果你的单元测试本身变得如此复杂 需要 为了测试它们的出现,你做错了。

        3
  •  2
  •   Jon Limjap    17 年前

    如果代码是生产代码,这肯定是我会采取的方向。示例如下:

    public class ObjectFactory 
    {
         public virtual A CreateA() { return new A(); }
         public virtual B CreateB() { return new B(); }
         public virtual C CreateC( string str ) { return new C( CreateA(), CreateB(), str );
         public virtual D CreateD( string str, int num )
         {
             return new D( CreateC( str ), num );
         }
    }
    
    
    public class Foo
    {
        private ObjectFactory ObjectFactory { get; set; }
    
        public Foo() : this(null) { }
        public Foo( ObjectFactory factory )
        {
             this.ObjectFactory = factory ?? new ObjectFactory();
        }
    
        public void Bar()
        {
            D objD = this.ObjectFactory.CreateD( param1, param2 );
        }
    }
    
    [TestMethod]
    public void TestBar()
    {
         var factory = MockRepository.GenerateMock<ObjectFactory>();
         var d = MockRepository.GenerateMock<D>();
         factory.Expect( f => f.CreateD( "abc", 10 ) ).Return( d );
    
         var foo = new Foo( factory );
    
         foo.Bar();
    
         factory.VerifyAllExpectations();
         d.VerifyAllExpectations();
    }
    
        4
  •  1
  •   Carl Manaster    17 年前

    .

    现在,这并不意味着你必须为它创建新的测试;它可以通过其他方法间接测试。如果它是在重构过程中提取的,那么它可能已经过测试。

    //--- don't write this, you'll probably regret it ;o)
    D d = new (new C(new A(), new B(), "string"), 1024);
    
        5
  •  0
  •   aberrant80    17 年前

    private 方法通常是一个指标,表明它们不需要直接测试,因为您将测试使用这些方法的方法

    该方法感觉像是属于工厂或构建器类,而不是私有方法。如果你将实例化代码隐藏为私有方法,那么它将无法进行优雅的测试。