模拟对象数据

时间:2010-05-12 18:11:18

标签: c# mocking test-data lorem-ipsum

我想模拟对象数据,而不是对象本身。换句话说,我想生成一个n个对象的集合,并将其传递给一个生成随机数据字符串和数字的函数。这有什么事吗?可以将其视为对象数据的Lorem Ipsum。不需要围绕数值范围等的约束,但这将是一个奖励。

5 个答案:

答案 0 :(得分:5)

当我读到你的问题时,我想到的第一件事是QuickCheck,一个Haskell的测试工具。在QuickCheck中,您可以指定函数应具有的属性(不变量),并且可以为输入指定有效范围(加上更多功能),QuickCheck将生成一堆随机输入数据并将其抛出到您的函数中并查看如果输出符合规范。我发现有一个F#端口,因此QuickCheck存在于.net世界中:

http://fscheck.codeplex.com/

还有一个MS Research项目Pex可能与你的想法很接近:

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

“...... Pex找到了方法的有趣输入输出值,您可以将其保存为具有高代码覆盖率的小型测试套件.Microsoft Pex是用于测试.NET Framework应用程序的Visual Studio插件。” / p>

我之前没有使用它,但看起来它有助于生成练习函数的任何和所有分支的边缘案例数据。它实际上分析了一个函数,而不仅仅是抛出真正随机的东西。

答案 1 :(得分:4)

似乎还有一个Ruby Faker gem的.NET端口,它可以很好地用于在Ruby中绑定假数据对象。我没有用它,但可能值得研究:

https://github.com/slashdotdash/faker-cs

答案 2 :(得分:3)

我很惊讶没有人提到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
}

答案 3 :(得分:2)

您可以设置一个ObjectRandomizer类,它接受一组对象,使用反射来检查私有成员的对象,然后使用反射为该成员设置一个随机值。只有当您不关心每个对象的随机数据时,这才有效。

或者,您可以为每个为其生成随机数据的数据对象构建一组类。如果您不想在实际程序集中包含随机生成方法,这可能会很好。例如,如果您有一个Person类,则可以在测试程序集中使用PersonRandomizer类。在您的测试类中(或在Randomizer类中),您可以使用反射来查找类型PersonRandomizer,如果它存在,则调用PersonRandomizer.Randomize(Person p)

如果你同意yahya的建议,我建议为支持随机化的对象创建一个接口IRandomizable,或者用一个你可以在运行时检测到的新属性Randomizable标记它们。

答案 4 :(得分:1)

对于我的测试,我只是为我创建的所有类添加一个方法,并将其称为随机化。每个类都知道该类对象的法律数据应该是什么样的。创建对象后,只需调用其randomize方法,用随机模拟数据填充它。您还可以添加专门的方法来根据约束生成随机数据字符串或数字,这些专门的方法可以在所有类中共享。