生成用于创建具有当前值的对象的代码

时间:2011-09-09 12:57:35

标签: c# unit-testing debugging code-generation

我有这种情况,我认为必须非常普遍:

class Parameter
{
  public int someInt;
  private decimal someDecimal;
  public SubParameter subParameter;
}

class SubParameter
{
  public string someString { get; set; }
}

我在调用一个以Parameter作为参数的方法时有一个断点。我想编写一个单元测试,我用相同的精确值(Parameter对象“tree”的副本)调用此方法。 在这种情况下编写声明和初始化类的所有字段和属性的许多行非常繁琐,这些字段和属性本身可能是非原始的等等。 如果我可以右键单击参数变量然后自动生成代码来创建这样的对象,那将是很好的。

因此,如果在我的断点处,我的Parameter对象具有值

Parameter parameter = new Parameter
  {
    someInt = 42, 
    someDecimal = 42.42m, 
    subParameter = new SubParameter { someString = "42" }
  };
好吧,然后会生成该代码。然后我可以使用生成的代码进行单元测试。

这样的事情存在吗?


编辑:

我想我一直不清楚。我非常清楚如何亲自编写代码。

我想要的是当我遇到一个断点并观察一个复杂的变量(或任何变量)时,我希望能够说:为我创建代码来创建这个变量的克隆。我会使用生成的代码进行单元测试。

这样的工具是否存在?

2 个答案:

答案 0 :(得分:0)

只需创建一个辅助方法来为您创建参数:

public void CreateParameter()
{
    return new Parameter
    {
        someInt = 42, 
        someDecimal = 42.42m, 
        subParameter = new SubParameter { someString = "42" }
    };
}

使用示例

[TestMethod]
public void MyTest()
{
    SomeClass.MethodBeingTested(CreateParameter());
}

如果您想拥有特定的参数值,请修改返回的参数或提供允许您提供该值的重载:

[TestMethod]
public void MyTest()
{
    Parameter parameter = CreateParameter();
    parameter.someInt = 23;
    SomeClass.MethodBeingTested(parameter);
}

我通常让我的CreateParameter使用随机值填充参数,以减少单位测试对某些值“偶然”传递的可能性,但对其他值则失败。

答案 1 :(得分:0)

您可以使用TestInitialize初始化测试方法:

    [TestClass]
    public class UnitTest1
    {
        Parameter _parameter = null;

        [TestInitialize]
        public void Initialize()
        {
            _parameter = new Parameter
            {
                someInt = 42,
                someDecimal = 42.42m,
                subParameter = new SubParameter { someString = "42" }
            };
        }

        [TestCleanup]
        public void Cleanup()
        {
            _parameter = null;
        }

        [TestMethod]
        public void MyTest1()
        {
           // test _parameter
        }

        [TestMethod]
        public void MyTest2()
        {
           // test _parameter
        }
    }