问题标签 [autofixture]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
3139 浏览

entity-framework - 使用假 DbContext 和 Autofixture 和 Moq 进行测试

所以按照这个例子

示例以及如何制作一个假的 DBContex 来测试我的测试使用这个工作正常

我现在尝试使用 Autofixture-Moq

创造“ciudades”,但我不能。我试试这个

我收到这个错误

无法将 System.Collections.Generic.IEnumerable(FakeDbSet(Ciudad)) 转换为 System.Data.Entity.IDbSet(Ciudad)

不能放“<>”所以我在错误信息中用“()”替换

IContext 和 FakeDbSet 的实现

怎样才能使它起作用?

0 投票
1 回答
491 浏览

c# - 相似——抛光和包装

我使用Ploeh.SemanticComparison'sLikeness作为一种有效表达映射过程预期输出的方式(如Mark Seemann 在 PluralSight 上的优秀高级单元测试课程中所述)。

我正在测试一些数据是否正确映射,如下所示:

但是,我不高兴:-

  1. 我想为 Resemblance 应用一个名称(即命名我的.Without( y => y.ProgrammaticIdentifier)​​自定义)
  2. 我已经失去了对称性Assert.Equal( expected,actual, comparer)(但我肯定需要来自 的错误消息ShouldEqual

有没有更简洁的方式在表达的约束范围内表达这一点?

0 投票
3 回答
925 浏览

c# - AutoFixture:提供 Func 作为构造函数参数

我对单元测试很陌生,正在用 xUnit 和 AutoFixture 做一些实验。

这是我要测试的类的构造函数:

我正在这样做:

我不确定如何设置构造函数参数(主要是第一个参数 - func 部分)。

在我的业务逻辑中,我正在像这样实例化这个类:

所以在我的测试中我应该这样调用函数:

但是如何通过 AutoFixture 进行设置。任何帮助将不胜感激。

0 投票
2 回答
492 浏览

c# - AutoFixture 声明式设置夹具的原则是什么?

我之前在 SO 上问过一个类似的问题,我得到了答案。当时,为了方便起见,我机械地应用了答案,但现在我试图了解声明式设置夹具的机制是如何的。

因此,我目前正在查看Mark Seemann 的在没有公共构造函数的情况下处理类型的博客文章并将其转换为声明性的。它与我的原始查询非常相似,但我无法让它工作。请注意,给出的代码实际上并不是生产代码,这是一个学习练习。

现在,如果它有帮助,我已经在 GitHub 上 获得了命令式代码,并且有问题的代码在下面复制:

这是与本文中给出的代码相似的代码

因此,我的问题是我应该知道/阅读什么才能将这段命令式代码转换为声明性的

0 投票
1 回答
1363 浏览

c# - 自动模拟 SUT

我已经阅读了 Mark Seeman关于自动模拟的文章,现在我正在根据该文章编写一个可重复使用的 Windsor 容器。

我对马克文章的实现(基本直接复制)

主要工作在AutoMoqResolver课堂上完成。每当一个类依赖于接口时,这将提供一个模拟:

AutoMoqResolver使用以下接口实现将其添加到容器中IWindsorInstaller

然后我的容器只需运行安装程序,它就可以为单元测试中的任何接口依赖项自动提供模拟:

极好的!

我已经对此进行了测试,并且很高兴地自动模拟了我的依赖项,因此我将其应用于一些真实的代码。这是当我意识到解决方案对我没有帮助的时候,因为我在测试课程时倾向于遵循的模式。我的具体问题是我希望能够自动模拟 SUT 本身,以验证 SUT 上的一种方法是否被另一个方法调用。

我需要测试的代码

我将通过一个例子来解释我自己。我正在开发 MVC 代码,并且使用以下通用模式支持不显眼的 AJAX:

我的测试模式

因此,为了验证该PerformTask()方法是从DoSomethingWithAjax()or调用的DoSomethingWithoutAjax(),我定义了一个新TestableExampleController类,如下所示:

然后我可以TestableExampleController用作我的 SUT,以便通过以下测试:

我的问题

像这样重构这个测试以使用我的AutoMockContainer类是行不通的:

测试未能创建实例,Mock<TestableExampleController>因为它找不到无参数构造函数。

无法实例化类的代理:MyNamespace.TestableExampleController。找不到无参数构造函数。参数名称:constructorArguments

我提出的解决方案

理想情况下,我想实现一个包装类,它可以在容器中注册,以自动为任何组件提供模拟:

我希望能够编写以下通过的测试:

我无法完全理解如何实现这一点,并且我大部分时间都在摆弄新的 ISubDependencyResolver 实现,但我就是无法让它工作。

希望我的问题很清楚,答案实际上相对简单?

0 投票
6 回答
13635 浏览

c# - AutoFixture.AutoMoq 为一个构造函数参数提供一个已知值

我刚刚开始在我的单元测试中使用AutoFixture.AutoMoq,我发现它对于创建我不关心特定值的对象非常有帮助。毕竟,匿名对象创建就是它的全部内容。

当我关心一个或多个构造函数参数时,我正在苦苦挣扎。采取ExampleComponent以下措施:

我想编写一个测试,其中我提供了一个特定的值,someValue但由AutoFixture.AutoMoqIService自动创建。

我知道如何使用FreezeIFixture来保持将被注入组件的已知值,但我不太清楚如何提供我自己的已知值。

这是我最想做的事情:

我知道我可以通过直接调用构造函数来做到这一点,但这将不再是匿名对象的创建。有没有办法像这样使用AutoFixture.AutoMock或者我需要将 DI 容器合并到我的测试中才能做我想做的事情?


编辑:

在我最初的问题中,我可能应该不那么抽象,所以这是我的具体情况。

我有一个ICache具有泛型TryRead<T>Write<T>方法的接口:

我正在实现一个CookieCachewhereITypeConverter处理对象与字符串之间的转换,并lifespan用于设置 cookie 的到期日期。

因此,在为 cookie 的到期日期编写测试时,我关心的是寿命,而不是转换器。

0 投票
1 回答
561 浏览

c# - AutoFixture:PropertyData 和异构参数

给定以下测试:

我想将夹具创建封装在它自己的类中,类似于:

问题是我正在使用PropertyData,后者提供了两个输入参数。然后我试图自动创建我的夹具作为参数的事实导致异常。

这是自定义属性数据:

解决此问题的选项有哪些?

0 投票
3 回答
1212 浏览

c# - 使用 AutoFixture 作为 SutFactory 时定义/管理 >1 个具有独立值的相同类型的构造函数参数

使用 AutoFixture 作为SutFactory,我可以看到,如果我注册或冻结一个类型的值,该值将用于该类型的所有后续使用。但是,如果我的类在构造函数中有两个相同类型的参数,例如:

使用自动夹具为参数 A 和参数 B 注入唯一的预定义值以测试计算值有哪些策略?

*不幸的是我不能在这里分享我的确切场景,但是它使用命令模式来操作另一个对象,所以设置参数A和参数B维护设计的唯一方法是将它们都注入,而构造函数是最简洁的方法在这种情况下执行此操作。

0 投票
1 回答
4711 浏览

c# - 使用 AutoFixture 创建递归树

我刚刚开始使用 AutoFixture 并拥有我想为其创建一些样本的半复杂数据结构。在我正在使用的测试中,我不太关心数据结构的内容。我只想要合理的默认值。

该数据结构的一部分是递归树。更具体地说,一个类包含一些其他类的集合,该集合包含其自身的子列表。类似于:

让我们假设由于各种原因我不能轻易改变这个结构。

如果我要求我的夹具创建 A ThrowingRecursionBehavior 将开始咆哮 B 是递归的。

如果我用 OmitOnRecursionBehavior 替换 ThrowingRecursionBehavior,我会得到一个 ObjectCreateException。

如果我尝试类似:fixture.Inject(Enumerable.Empty()); 我从 DictionaryFiller 中得到“已添加具有相同密钥的项目”。如果我用 NullRecursionBehavior 替换 ThrowingRecursionBehavior,也会发生同样的事情。

我想做几件事。

  • 用空的 B 列表创建 A 样本的最佳方法是什么?
  • 创建一个包含几个 B 和几个孩子的 B 孩子(一棵小树)的 A 样本的最佳方法是什么?

对于我的最后一个愿望,最好指定一些递归深度,然后使用 Enumerable.Empty (或零大小的数组/列表,甚至为空)。我知道 AutoFixture 的扩展非常灵活。所以我想应该有可能创建一些完全做到这一点的样本生成器。事实上,我会尝试使用自定义的 ISpecimenBuilder,但也许有人已经有了更智能的解决方案。例如,在 RecursionGuard 中修改这一行是否有意义:

0 投票
4 回答
6201 浏览

c# - How to configure AutoFixture to use an enum value as seed when creating many of a certain type?

I have the following types:

Now, when executing fixture.CreateMany<User> I want AutoFixture to return two Users, one per status. All other properties - like Name - should be filled with anonymous data.

Question:
How to configure AutoFixture to do this?


I tried the following this:

  1. Register collection that news up the User object:

    The problem with this approach is that AutoFixture doesn't fill the other properties like Name

  2. Customize User to use a factory and register a collection that uses fixture.Create:

    That didn't work either. The seed isn't being used.