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

C语言中Moq克隆方法的单元测试#

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

    public class SimpleClass
    {
        public int ValueA { get; set; }
    
        public string ValueB { get; set; }
    
        public ulong ValueC { get; set; }
    
        public SimpleClass TypedClone()
        {
            var item = new SimpleClass
            {
                ValueA = this.ValueA,
                ValueB = this.ValueB,
                ValueC = this.ValueC 
            };
    
            return item;
        }
    }
    

    我想要一个单元测试,它将告诉我是否添加了值,但忘记了将其添加到克隆方法中。我的第一次尝试是使用Moq及其VerifyGet方法来确保每个属性都被访问。

        public void GenericCloneTest()
        {
            var mock = new Mock<SimpleClass>();
            var c = mock.Object.GenericClone();
            var properties = typeof(SimpleClass).GetProperties();
    
            foreach (var property in properties)
            {
                var expression = Expression.Property(
                    Expression.Parameter(typeof(SimpleClass), "c"), 
                    property);
    
                var type = Expression.GetFuncType(typeof (SimpleClass),  
                    property.PropertyType);
    
                var actionExpression = Expression.Lambda(type, expression,
                    Expression.Parameter(typeof(SimpleClass), "c"));
    
                mock.VerifyGet<object>
                    ((Expression<Func<SimpleClass,object>>)actionExpression);
            }
        }
    

    我甚至不确定使用最小起订量是不是一个好主意,这只是我的第一个想法。

          var signature = typeof (Connection)
                .GetProperties()
                .Select(p => p.Name)
                .Aggregate(
                    new StringBuilder(), 
                    (builder, name) =>
                        builder.Append(name)).ToString();
    
          Assert.AreEqual(
               "DataSessionStateDataTechnologyBytesReceivedBytesSentDuration",
               signature);
    

    如果我添加属性,测试将失败。这仍然取决于我是否有足够的责任在签名匹配失败时修复测试的其余部分。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Paul Alexander    15 年前

    确保获取所有字段的最简单方法之一就是简单地使用MemberwiseClone()方法。这将自动将所有类字段复制到新实例。

        2
  •  2
  •   James Avery    15 年前

    你不想在这里使用最小起订量,你只需要使用一些反射。基本上,编写一个测试,创建对象的实例,设置每个属性,克隆它,然后确保克隆上的每个属性相等。

    正如Paul所说,请查看MemberwiseClone(),它基本上为您实现了这一点,或者至少实现了iClonable,这是如何实现这一点的标准实践。(MemberwiseClone()只执行浅层复制,这就是您可能需要实现IClonable的原因)。然后,您甚至可以编写一个测试,检查程序集中实现IClonable的所有内容,并对其进行测试。