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

C# 生成用于创建具有当前值的对象的代码,c#,unit-testing,debugging,code-generation,C#,Unit Testing,Debugging,Code Generation,我有这样一种情况,我认为这一定很常见: class Parameter { public int someInt; private decimal someDecimal; public SubParameter subParameter; } class SubParameter { public string someString { get; set; } } 我在调用将参数作为参数的方法时有一个断点。我想写一个单元测试,在这里我用相同的精确值调用这个方法(参数对象“t

我有这样一种情况,我认为这一定很常见:

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

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

因此,如果在断点处,参数对象具有

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

这样的事情存在吗


编辑:

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

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


是否存在这样的工具?

只需创建一个帮助器方法即可为您创建参数:

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
使用随机值填充参数,以减少单元测试碰巧通过某些值的“偶然”测试,但其他值的测试将失败的可能性。

您可以使用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
        }
    }