【发布时间】:2018-12-07 07:37:05
【问题描述】:
上下文
我想创建一个我的类的集合,但它的一些字符串属性具有约束值。我希望这些值在约束集中仍然是随机的。
我想出了自定义的方式,但我的随机生成实现似乎没有使用任何 AutoFixture 功能,我不想重新发明轮子:
var random = new Random();
var fixture = new Fixture();
fixture.Customize<MyClass>(b => b
.With(i => i.MyProperty, random.Next(2) == 0 ? "O" : "C"));
var result = fixture.CreateMany<MyClass>(1000);
问题
有没有更有效的方法告诉 AutoFixture 我想要一个随机字符串“O”或“C”?
编辑
同时我意识到上面的代码根本不起作用,所以它不符合“备份”计划的条件。 (表达式:random.Next(2) == 0 ? "O" : "C" 只计算一次)
【问题讨论】:
-
@MarkSeemann:也许是我,但我不知道这两个链接是如何回答的。两个链接都在自定义特定对象“MyClass”或 StreetName 生成。在我的情况下,对象是“字符串”。顺便说一句,我意识到我的示例不起作用,因为表达式 "random.Next(2) == 0 ? "O" : "C"" 只评估了一次(我理解为什么,这不是问题的一部分)。我也理解域建模会更好,但是当我的任务是编写单元测试时,我无法根据我应该如何编码的想法来重写企业应用程序。
-
好的,我已经重新打开了帖子,所以我会把链接留在这里,以便其他人可以看到我链接的内容:stackoverflow.com/q/47761145/126014
-
解决此问题的最简单方法可能是引入您使用
ElementsBuilder配置的特定于测试的帮助程序类型,然后添加一个ISpecimenBuilder将某些字符串的请求转发到该帮助程序类型.有关一些示例,请参见上述链接以及以下链接:stackoverflow.com/a/49492820/126014 -
好的,三个都读完了。尽管一切都很清楚,但对于简单的日常任务来说,它们太过分了。我的意思是在数据模型中可能有无数简单类型属性(字符串、整数),我们必须从有限的集合中进行选择。对于所有这些属性,我们必须反复引入辅助对象,并编写数十行代码。主要使用复制和粘贴(或开发辅助基础设施以防止复制和粘贴)听起来并不实用,而且生产力增强...
标签: c# unit-testing autofixture