【发布时间】:2012-04-22 23:04:42
【问题描述】:
我有一个使用开放泛型的对象模型(是的,是的,现在我有两个问题;这就是我在这里的原因:) :-
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 无法从 IOGF`1[C] 创建实例,很可能是因为它没有公共构造函数,是抽象或非公共类型。
我很高兴为它提供一个具体的实现:
public class OGF<T> : IOGF<T>
{
public OGF( IX x )
{
}
}
public interface IX
{
}
public class X : IX
{
}
还有一个关联的绑定:
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 的回答的评论)这里的(诚然人为的)上下文是对大型“几乎完整系统”系统被测对象图的验收测试,而不是小型(受控/易于理解 :)单元或集成测试场景中的一对或三组类。正如自我问题的括号陈述中提到的那样,我并不完全相信这种类型的测试是否有意义。
【问题讨论】:
-
AutoMoq、AutoRhinoMocks 和 AutoFakeItEasy 是允许您将 AutoFixture 用作自动模拟容器的扩展。这是一个选项吗? (因为这样您就可以成功创建 D 的匿名实例。)
-
@Nikos 我知道自动模拟扩展并在心理上排除了它们 - 应该提到这一点;有关更多背景信息,请参阅我对 Mark 的回答的 cmets)。把这个评论和马克的回答放在心上,我会加倍努力避免依赖我的拐杖!
-
@RubenBartelink 很好奇,这个开放的通用代码是用来做什么的?我喜欢人们使用开放的泛型来解决问题,但是泛型的 C# 不规则类型系统,带有极端情况和陷阱,有时让我觉得付出的努力是不值得的。
-
@JohnZabroski Ha,我现在不记得了 - 使用一些通用存储库反模式测试东西?!
标签: c# generics autofixture open-generics