Tag: 自动混合

使用AutoFixture为递归数据结构创建夹具

我正在开发一个项目,我有一些递归数据结构,我想为它创建一个夹具。 数据结构是XmlCommandElement ,它有一个方法ToCommand将XmlCommandElement转换为Command 。 树上的每个节点都可以是XmlCommandElement和/或XmlCommandPropertyElement 。 现在,为了测试ToCommand方法的行为,我想用一些任意数据获取XmlCommandElement 。 我想控制每个节点的树的深度和XmlCommandElement和/或XmlCommandPropertyElement的实例数量。 所以这是我用于灯具的代码: public class XmlCommandElementFixture : ICustomization { private static readonly Fixture _fixture = new Fixture(); private XmlCommandElement _xmlCommandElement; public int MaxCommandsPerDepth { get; set; } public int MaxDepth { get; set; } public int MaxPropertiesPerCommand { get; set; } public XmlCommandElementFixture BuildCommandTree() { _xmlCommandElement = new […]

分层对象和AutoFixture

我已经实现了一个用于存储标签的类,标签集合必须是层次化的,所以我的类是: public class Tag { public int Id { get; set; } public int Description { get; set; } public Tag ParentTag { get; set; } // … (methods for get children, add and remove children, etc.) } 这样,根标签(用户希望能够拥有许多单独的树)没有父标记,而非根标记必须具有父标记。 这是实现层次结构的好方法吗? 我发现复合模式,但在我的域中,所有标签都只是标签,对于域专家,父标签和子标签之间没有区别。 在测试中使用AutoFixture出现问题; 当我需要创建一个简单的标签时,它会引发这个错误: 失败: Ploeh.AutoFixture.ObjectCreationException :AutoFixture无法创建Ploeh.AutoFixture.Kernel.SeededRequest类型的实例,因为遍历的对象图包含循环引用。 编辑:我阅读使用AutoFixture创建递归树,但它是不同的情况:我只有一个类,而不是2,我不希望自动混合创建一个树,但只有一个节点

如何使用AutoFixture生成在编译时未知的任意类型的存根对象

我可以得到像这样的构造函数参数类型: Type type = paramInfo.ParameterType; 现在我想从这种类型创建存根对象。 有可能吗? 我试过autofixture: public TObject Stub() { Fixture fixture = new Fixture(); return fixture.Create(); } ..但它不起作用: Type type = parameterInfo.ParameterType; var obj = Stub();//Compile error! (“cannot resolve symbol type”) 你能救我吗?

如何将AutoFixture自定义应用于从基类inheritance的任何内容?

为了试图干掉我的unit testing,我试图使用AutoFixture作为IoC容器来实例化我的被测系统(SUT),在这种特殊情况下是ASP.NET MVC Controller 。 因此,我想自定义AutoFixture以创建没有自动属性的控制器。 我尝试为ControllerBase添加自定义,但它似乎不适用于ControllerBase子类。 fixture.Customize(c => c.OmitAutoProperties()); 这是我希望能够编写的测试示例: [Theory, AutoFixtureData] public void ControllerTest(AccountController controller) { Assert.Equal(default(UrlHelper), controller.Url); } 当然,如果我为项目中的每个特定控制器手动添加一个自定义,但是谁想要这样做呢? 有没有更好的办法?

使用Autofixture将子实例上的属性值设置为固定值

在使用Autofixture构建父级时,是否可以为子实例上的属性分配固定值? 它会将默认值添加到子实例上的所有属性(如charm),但我想覆盖并为子实例上的某个属性指定特定值。 鉴于这种父/子关系: public class Person { public string FirstName { get; set; } public string LastName { get; set; } public Address Address { get; set; } } public class Address { public string Street { get; set; } public int Number { get; set; } public string City { get; set; } public […]

如何在AutoFixture中设置更复杂(IoC类似)的注册

使用AutoFixture时,是否可以在集成测试中重用生产IoC容器注册? 问题是,如果未注册依赖项,我需要以下fixture设置来注入模拟并注入“真正的”数据库相关依赖项 var fixture = new Fixture().WithMocks().WithRealDatabase() 我试过的解决方案 internal static Fixture WithMocks(this Fixture fixture) { fixture.Customize(new AutoMoqCustomization()); } internal static Fixture WithRealDatabase(this Fixture fixture) { var containerBuilder = new Autofac.ContainerBuilder(); … containerBuilder.Register(c => c.Resolve().OpenSession()) containerBuilder.RegisterGeneric(typeof(Repository)).AsImplementedInterfaces() containerBuilder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies()) .Where(t => t.Name.EndsWith(“Repository”)) .AsImplementedInterfaces(); … fixture.Customizations.Add(new ContainerSpecimenBuilder(containerBuilder.Build())); } internal class ContainerSpecimenBuilder : ISpecimenBuilder { private readonly IContainer container; public […]

使用AutoFixture实例化对象时,指定属性值

我的测试要求我将不可变Rsvp对象的Response属性(见下文)设置为特定值。 public class Rsvp { public string Response { get; private set; } public Rsvp(string response) { Response = response; } } 我最初尝试使用Build().With(x => x.Rsvp, “Attending”) ,但意识到这只支持可写属性。 我将其替换为Build().FromFactory(new Rsvp(“Attending”)) 。 这可行,但对于更复杂的对象来说很麻烦,因为它们与某些属性无关。 例如,如果Rsvp对象具有CreatedDate属性,则此实例化对象的方法将强制我编写Build().FromFactory(new Rsvp(“Attending”, fixture.Create())) 。 有没有办法只为不可变对象指定含义属性的值?

CreateMany与种子有什么关系?

具有T seed参数的CreateMany重载实际上做了什么? 我试图播种,但种子似乎对创建的对象没有影响。 例如,我期待如果我的种子具有string类型的属性,那么: 字符串值将用于在所有新创建的对象中填充该属性 或者在所有新创建的对象中设置该属性时,字符串值将用作前缀

使用AutoFixture创建递归树

我刚刚开始使用AutoFixture并拥有这个半复杂的数据结构,我想创建一些标本。 在我正在进行的测试中,我不太关心数据结构的内容。 我只想要合理的默认值。 此数据结构的一部分是递归树。 更具体地说,一个类包含一些其他类的集合,其中包含自身的子列表。 类似于: public class A { private IEnumerable bNodes; public A(IEnumerable bNodes) { this.bNodes = bNodes; } } public class B { private IEnumerable children; public B(IEnumerable children) { this.children = children; } } 让我们假设我不能因各种原因轻易改变这种结构。 如果我要求我的夹具创建一个ThrowingRecursionBehavior将开始咆哮B是递归的。 如果我用OmitOnRecursionBehavior替换ThrowingRecursionBehavior,我会得到一个ObjectCreateException。 如果我尝试类似:fixture.Inject(Enumerable.Empty()); 我从DictionaryFiller获得“已添加相同键的项目”。 如果我用NullRecursionBehavior替换ThrowingRecursionBehavior,也会发生同样的事情。 我想要几件事。 用空的B列表创建A样本的最佳方法是什么? 创建一个A标本的最佳方法是什么,其中包含一些含有少数几个孩子(一棵小树)的B孩子的B? 对于我的遗愿,指定一些递归深度可能会很好,之后使用Enumerable.Empty(或零大小的数组/ List或甚至为null)。 我知道AutoFixture可以非常灵活地扩展。 因此,我认为应该可以创建一些完全符合这一要求的样本构建器。 事实上,我会尝试使用自定义的ISpecimenBuilder,但也许有人已经拥有了一个更智能的解决方案。 例如,在RecursionGuard中修改此行是否有意义: public object […]