问题描述
AutoFixture(或我的误用)似乎已导致xunit测试运行程序停止在树视图中显示每个内联数据实例的单独测试。通常,如果我使用[Theory]和[InlineData],则会在测试运行器树视图中显示单个测试,每个[InlineData]一个。在以下情况下不再发生这种情况:
我创建了一个自定义automoqDataAttribute类,以始终使用automoqCustomization并禁用递归:
public sealed class automoqDataAttribute : AutoDataAttribute
{
/// <summary>
/// Automaticaly adds the "Auto Moq" customization to fixures that use the
/// AutoDataAttribute attribute.
/// </summary>
public automoqDataAttribute() : base(() =>
{
// Create a fixture we can customize.
var fixture = new Fixture();
// Remove the recursion checks as we have objects that require recursion.
var throwingRecursionBehavior = fixture.Behaviors.FirstOrDefault(behavior => behavior.GetType() == typeof(ThrowingRecursionBehavior));
if (throwingRecursionBehavior != null) fixture.Behaviors.Remove(throwingRecursionBehavior);
// Have to also add in the OmitOnRecursionBehavior to avoid a stack overflow error
// presumably,since we removed the above,and without this,AutoFixture follows every
// object and just keeps trying to auto fill its data. By following the circular
// references it just goes on forever.
fixture.Behaviors.Add(new OmitOnRecursionBehavior());
// Use the "Auto Moq" customization so we have AutoFixture automatically mock objects for us.
fixture.Customize(new automoqCustomization());
return fixture;
}) { }
}
然后,当我使用Theory / InlineData时,我希望它能够正常工作,因此我也创建了这个代码:
public class InlineautomoqDataAttribute : InlineAutoDataAttribute
{
public InlineautomoqDataAttribute(params object[] values) : base(new automoqDataAttribute(),values) { }
}
最后,我尝试运行一些测试:
public class TestClass
{
public bool Val { get; set; }
}
[Theory]
[InlineData("blah 1",true)]
[InlineData("blah 2",true)]
public void Test1(string dummy,bool expected)
{
Assert.Equal(expected,true);
}
上面的方法工作正常……但是我运行了这个
[Theory]
[InlineautomoqData("blah 1",false)]
[InlineautomoqData("blah 2",false)]
public void Test2(string dummy,bool expected,TestClass sut)
{
Assert.Equal(expected,sut.Val);
}
运行测试,但我没有像通常那样在测试运行程序中看到两个测试,每个InlineautomoqData一个。如果单击测试并在“测试详细信息摘要”面板中查看,我会看到它们,这几乎可以满足要求,除非我无法从此处重新运行失败的测试(并且我指的是针对单个InlineData案例的测试)。我可以从树状视图中查看,但是再一次,它们没有显示在那里,所以这是一个大问题,因为它运行所有InlineautomoqData测试,并且我想隔离并仅运行例如一个失败了。
[Datadiscoverer(“ Xunit.Sdk.InlineDatadiscoverer”,“ xunit.core”)]
在我的InlineautomoqDataAttribute中,单个测试(每个InlineautomoqData一个)显示在测试浏览器中,但随后出现此错误:
“ InvalidOperationException:测试方法期望2个参数值,但是提供了1个参数值。”
表示AutoFixture自动模拟值不起作用。
有什么办法可以让我的自定义InlineautomoqData属性仍然在测试浏览器中显示每个InlineautomoqData的测试?这是我应该向AutoFixture报告的错误,还是我做错了什么?
解决方法
这是AutoFixture中的一个已知问题,尽管我不确定GitHub存储库中是否存在正式问题。如果没有,欢迎您提出问题并在那里跟踪问题的进展。