我有一个用xUnit,AutoFixture编写的单元测试,使用AutoFixture Idioms GuardClauseAssertion检查程序集类中的guard子句:
[InlineData(typeof (ProjectOneClass))]
[InlineData(typeof (ProjectTwoClass))]
[InlineData(typeof (ProjectThreeClass))]
[InlineData(typeof (ProjectFourClass))]
[InlineData(typeof (ProjectFiveClass))]
[Theory(DisplayName = "Classes guard against null arguments in assemblies")]
public void GuardAgainstNullArgumentsInAssemblies(Type assemblyHintType)
{
// arrange
IFixture fixture = new Fixture().Customize(new AutoMoqCustomization());
fixture.Behaviors.Add(new TracingBehavior());
var assertion = new GuardClauseAssertion(fixture);
// assert
assertion.Verify(assemblyHintType.Assembly.GetTypes()
.Where(t =>
!t.Name.Equals("MyWebServices") &&
!t.Name.Equals("MyComputer") &&
!t.Name.Equals("MyProject") &&
!t.Name.Equals("MyApplication") &&
!t.IsInterface &&
!t.IsGenericType &&
!t.IsCompilerGenerated() &&
!t.IsStaticClass()
));
}
我使用过滤器进行断言,将单元测试集中在我编写的相应类上,并使用提示类型来定位特定的程序集。我在使用InlineData(typeof(...))
时传递了这些提示类型,因此每个提示类型的测试都是一次。
测试通过5次测试中的3次,经过一些测试运行,指出我忘记放入空值守卫的代码,但其他两个测试产生以下异常:
System.BadImageFormatException尝试加载程序 格式不正确。 (来自HRESULT的异常:0x8007000B)
System.Reflection.Emit.TypeBuilder.TermCreateClass(RuntimeModule模块,的Int32 TK,ObjectHandleOnStack型) 在System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()at System.Reflection.Emit.TypeBuilder.CreateType()at Ploeh.AutoFixture.Idioms.GuardClauseAssertion.AutoGenericArgument.get_Value() 在System.Linq.Enumerable.WhereSelectArrayIterator
2.MoveNext() at System.Linq.Buffer
1..ctor(IEnumerable1 source) at System.Linq.Enumerable.ToArray(IEnumerable
1 source)at at Ploeh.AutoFixture.Idioms.GuardClauseAssertion.AutoGenericMethod.get_Value() 在 Ploeh.AutoFixture.Idioms.GuardClauseAssertion.Verify(MethodInfo的MethodInfo的) 在 Ploeh.AutoFixture.Idioms.IdiomaticAssertion.Verify(MethodInfo的[] methodInfos) 在Ploeh.AutoFixture.Idioms.IdiomaticAssertion.Verify(Type type)at at Ploeh.AutoFixture.Idioms.IdiomaticAssertion.Verify(Type [] types)at at NullGuardTests.GuardAgainstNullArgumentsInNonModelAssemblies(类型assemblyHintType) 在NullGuardTests.cs中:第58行
我将TracingBehavior
添加到IFixture
实例以获得更多可见性,并显示:
Requested: Infrastructure.Logging.IErrorAggregator errorAggregator Requested: Ploeh.AutoFixture.Kernel.SeededRequest
......等等......等等。
我已经查看了第一个项目以及这条长轨迹中的最后一项,试图找出它们与成功测试痕迹中显示的第一个/最后一个项目有何不同,但我没有能够找到任何有意义的差异。
我假设跟踪中的最后一项是异常前IFixture
的最后一项活动。
除了我迄今为止所做的工作之外,我如何更好地了解此类例外情况?
想法?提前谢谢。
2014年3月29日更新
我仍然无法弄清楚这里发生了什么,但我希望保留这个问题至少对于有同样问题的其他人来说是一个理智的检查,他们在这里发现了这个问题。工作量许可,我将致力于提交一个repro。