- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个使用开放泛型的对象模型(是的,是的,现在我有两个问题;这就是我来这里的原因:) :-
public interface IOGF<T>
{
}
class C
{
}
class D
{
readonly IOGF<C> _ogf;
public D( IOGF<C> ogf )
{
_ogf = ogf;
}
}
我正在尝试让 AutoFixture 生成 D
的匿名实例多于。但是,就其本身而言,AutoFixture 没有构建 IOGF<>
的内置策略。因此我们观察到:
public class OpenGenericsBinderDemo
{
[Fact]
public void X()
{
var fixture = new Fixture();
Assert.Throws<Ploeh.AutoFixture.ObjectCreationException>( () =>
fixture.CreateAnonymous<D>() );
}
底层消息是:
Ploeh.AutoFixture.ObjectCreationException : AutoFixture was unable to create an instance from IOGF`1[C], most likely because it has no public constructor, is an abstract or non-public type.
我很乐意为它提供一个具体的实现:
public class OGF<T> : IOGF<T>
{
public OGF( IX x )
{
}
}
public interface IX
{
}
public class X : IX
{
}
和关联的绑定(bind):
fixture.Register<IX,X>();
我如何(或者我应该这样看待问题??)让下面的测试通过?
public class OpenGenericsLearning
{
[Fact]
public void OpenGenericsDontGetResolved()
{
var fixture = new Fixture();
fixture.Inject<IX>( fixture.Freeze<X>() );
// TODO register or do something that will provide
// OGF<C> to fulfill D's IOGF<C> requirement
Assert.NotNull( fixture.CreateAnonymous<D>());
}
}
(在 codeplex 站点上有关于此的讨论和问题 - 我只需要快速实现这一点,如果这只是一个坏主意和/或我错过了一些东西,我愿意删除它)
编辑 2:(另请参阅对 Mark 的回答的评论)这里的(公认的人为的)上下文是对大型“几乎完整系统”的被测系统对象图而不是小型(受控/易于理解 :) 的验收测试单元或集成测试场景中的一对或三组类。正如在 self 提问的附加陈述中提到的,我并不完全相信这种类型的测试是否有意义。
最佳答案
您可以创建一个按如下方式工作的自定义:
public class AnOpenGenericsBinderDemo
{
[Fact]
public void RegisteringAGenericBinderShouldEnableResolution()
{
var fixture = new Fixture();
fixture.Inject<IX>( fixture.Freeze<X>() );
fixture.RegisterOpenGenericImplementation( typeof( IOGF<> ), typeof( OGF<> ) );
Assert.IsType<OGF<C>>( fixture.CreateAnonymous<D>().Ogf );
}
}
并且是这样实现的:
public static class AutoFixtureOpenGenericsExtensions
{
public static void RegisterOpenGenericImplementation( this IFixture that, Type serviceType, Type componentType )
{
if ( !serviceType.ContainsGenericParameters )
throw new ArgumentException( "must be open generic", "serviceType" );
if ( !componentType.ContainsGenericParameters )
throw new ArgumentException( "must be open generic", "componentType" );
// TODO verify number of type parameters is 1 in each case
that.Customize( new OpenGenericsBinderCustomization( serviceType, componentType ) );
}
public class OpenGenericsBinderCustomization : ICustomization
{
readonly Type _serviceType;
readonly Type _componentType;
public OpenGenericsBinderCustomization( Type serviceType, Type componentType )
{
_serviceType = serviceType;
_componentType = componentType;
}
void ICustomization.Customize( IFixture fixture )
{
fixture.Customizations.Add( new OpenGenericsSpecimenBuilder( _serviceType, _componentType ) );
}
class OpenGenericsSpecimenBuilder : ISpecimenBuilder
{
readonly Type _serviceType;
readonly Type _componentType;
public OpenGenericsSpecimenBuilder( Type serviceType, Type componentType )
{
_serviceType = serviceType;
_componentType = componentType;
}
object ISpecimenBuilder.Create( object request, ISpecimenContext context )
{
var typedRequest = request as Type;
if ( typedRequest != null && typedRequest.IsGenericType && typedRequest.GetGenericTypeDefinition() == _serviceType )
return context.Resolve( _componentType.MakeGenericType( typedRequest.GetGenericArguments().Single() ) );
return new NoSpecimen( request );
}
}
}
}
我假设有人有比这更好的实现和/或有一个内置的实现。
编辑:以下是具有传感属性的更新 D:
class D
{
readonly IOGF<C> _ogf;
public D( IOGF<C> ogf )
{
_ogf = ogf;
}
public IOGF<C> Ogf
{
get { return _ogf; }
}
}
关于c# - AutoFixture:配置开放式泛型样本生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10092446/
我刚刚更改了我的 [RegularExpression] 验证,我三分之一的单元测试失败了! 事实证明 AutoFixture 正在根据该正则表达式生成值,这很酷,但它不理解所有正则表达式,所以我想为
我使用 Autofixture 作为 SUT 工厂,但在卡住空实例时遇到困难。 我想做这样的事情: _fixture.Freeze(c => null); 但很快就意识到这是错误的。我已经用这个解决了
我想以不确定的方式自动生成方法的返回值,即每次调用/测试运行时,我都希望方法返回随机值。目前它总是返回方法调用的默认值: public interface IReturn {
给定这些类: public class DrumAndBassBand { public Drums Drum { get; set; } public Bass Bass { get
我正在将我的测试移植到 AutoFixture 2.0 ,而且我遇到了一些我既无法解释也无法解决的奇怪行为。这个简单的测试对我来说失败了: var autoFixtures = new Fixture
我正在研究一个相当嵌套的模型,它有一些循环引用。它还使用 Entity Framework ,因此所有列表都是 ICollection .为了适应这一点,我正在像这样配置 AutoFixture: _
我正在尝试使用 NSubstitute (1.8.2)、AutoFixture (3.33) 和 AutoFixture.AutoNSubstitute (3.33),如下所示: 我有一个 poco,
当我添加一个新的 TracingBehavior到自动夹具 Fixture实例使用 fixture.Behaviors.Add(new TracingBehavior()); 我在我的 R# 单元测试
我目前正在使用 EF Core Code First Approach,并且我有以下域类: public class Employee { // several properties such a
我刚刚开始使用 AutoFixture,我正在了解基础知识(从我所看到的还有更多),但我遇到了一个问题,我不能 100% 确定对于此类事情的最佳实践是什么。 我正在测试一个 Controller ,该
我在我的单元和集成测试中使用 AutoFixture 并遇到了问题。我正在生成数据传输对象,其中一些类在属性上具有 DataAnnotation 属性(其中一些是自定义的)。 AutoFixture
如何设置确定性测试以验证列表中的项目是否已排序? 首先,我执行以下操作: public void SyncListContainsSortedItems( [Frozen] SyncItem[
默认情况下,AutoFixture在“本地未指定时间”中创建DateTime结构。 我一直在尝试找到一种方法来配置它以创建具有UTC类型的DateTime结构,但是到目前为止没有成功。 有没有办法做到
是否可以在卡住后解冻对象类型? 如果我有一个使用 DateTime 的对象 Appointment,有没有办法做这样的事情? var time = fixture.Freeze(); IEnumera
有什么办法可以给 AutoFixture 一个对象的实例,让它通过所有的 setter 并设置随机数据? wiki 示例仅显示如何从 AutoFixture 获取实例,例如 var autoGener
在我使用 AutoFixture 之前的日子里,我可能做了以下安排来设置名为 CustomerService 的服务的单元测试: public void TestName() { //Arrang
我正在尝试编写这个简单的测试: var fixture = new Fixture().Customize(new AutoMoqCustomization()); var postProcessin
我正在尝试使用 SUT Factory “模式”来创建我的 SUT。 给定 SUT 结构: namespace MySut { public class Dep1 { }
我正在使用的域模型有很多循环引用。事实上,可以从图中的任何点到达大多数对象。许多这些循环引用也在集合中。所以一个 Booking将收藏 Students其中有 Courses 的集合其中有 Booki
我遇到了这个错误。 Ploeh.AutoFixture.Kernel.IllegalRequestException : A request for an IntPtr was detected. T
我是一名优秀的程序员,十分优秀!