虚拟对象数据

5
我想模拟对象数据,而不是对象本身。换句话说,我想生成一个包含n个对象的集合,并将其传递给一个函数,该函数生成随机数据字符串和数字。有没有什么方法可以做到这一点?可以将其视为对象数据的Lorem Ipsum。数值范围等限制并非必需,但会是一个额外的奖励。

这看起来(几乎)像是 https://dev59.com/MnRB5IYBdhLWcg3wiHz7 的重复。 - Jeremy Roberts
@Jeremy 这些是针对数据库的。我正在寻找与纯对象相关的解决方案。 - Keith Adler
真的,但是那个线程中的一些答案在去数据库之前创建对象。我认为有足够的重叠部分值得指出,而不需要标记。 - Jeremy Roberts
5个回答

5
当我读到你的问题时,我首先想到的是QuickCheck,这是一个适用于Haskell的测试工具。在QuickCheck中,您可以指定函数应该具有的属性(不变量),并且可以指定输入的有效范围(加上一堆其他功能),QuickCheck将生成一堆随机输入数据并将其传递给函数,并检查输出是否符合规范。通过一些调查,我发现它有一个F#端口,因此QuickCheck也存在于.NET世界中。

http://fscheck.codeplex.com/

还有一个微软研究项目Pex,可能与您所想的接近:

http://research.microsoft.com/en-us/projects/Pex/

"……Pex可以找到您的方法的有趣输入输出值,您可以将其保存为具有高代码覆盖率的小型测试套件。Microsoft Pex是用于测试.NET Framework应用程序的Visual Studio插件。"
"我以前没有使用过它,但它似乎很适合生成边缘情况数据,以激活函数的所有分支。实际上,它会分析一个函数,而不仅仅是向其抛出真正随机的东西。"

4
我很惊讶还没有人提到AutoFixture
[TestMethod]
public void IntroductoryTest()
{
    // Fixture setup
    Fixture fixture = new Fixture();

    int expectedNumber = fixture.CreateAnonymous<int>();
    MyClass sut = fixture.CreateAnonymous<MyClass>();
    // Exercise system
    int result = sut.Echo(expectedNumber);
    // Verify outcome
    Assert.AreEqual<int>(expectedNumber, result, "Echo");
    // Teardown
}

4

2
您可以设置一个ObjectRandomizer类,该类接受一个对象数组,使用反射检查对象的私有成员,然后使用反射为该成员设置随机值。这仅适用于您不关心每个对象的随机数据长什么样子的情况。
或者,您可以为每个数据对象构建一组类来生成随机数据。如果您不想在实际程序集中包含随机生成方法,则可能效果很好。例如,如果您有一个Person类,则可以在测试程序集中拥有一个PersonRandomizer类。在您的测试类(或Randomizer类)中,然后可以使用反射查找类型PersonRandomizer,如果存在,则调用PersonRandomizer.Randomize(Person p)
如果您选择yahya的建议,我建议为支持随机化的对象创建一个接口IRandomizable,或使用一个新属性Randomizable标记它们,以便您可以在运行时检测到它们。

1
对于我的测试,我会添加一个方法到我创建的所有类中,该方法称为“randomize”。每个类知道该类对象的合法数据应该是什么样子。在创建对象后,只需调用其“randomize”方法,即可使用随机模拟数据填充它。您还可以添加专门的方法来生成基于约束条件的随机数据字符串或数字,并且这些专门的方法可以在所有类之间共享。

我考虑过在基类上实现这个功能,并使用反射生成适当的数据,但我想要一个已经存在并可以插入的东西。也许这是我应该创建的东西。 - Keith Adler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接