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

本文关键字:对象 代码 用于 创建 | 更新日期: 2023-09-27 18:08:11

我有这样一个场景,我认为这一定是很常见的:

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" }
  };

那么代码就会生成。然后,我可以使用生成的代码进行单元测试。

这样的东西存在吗?


编辑:

我想我没说清楚。我非常清楚如何自己手工编写代码。

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

这样的工具存在吗?

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

创建一个帮助器方法来为您创建参数:

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
        }
    }