根据部分信息,很难确切地说出如何进一步减少上述测试,但我猜测它可以减少。
首先,调用组合Inject
其次是CreateAnonymous
这是相当惯用的——特别是如果你颠倒顺序的话。这就是所谓的Freezing http://blog.ploeh.dk/2010/03/17/AutoFixtureFreeze.aspx匿名值(相当于 DI 容器的 Singleton 生命周期范围)。可以这样更简洁地表述:
var vc = fixture.Freeze<ViewContext>();
测试似乎也将 HttpContext 映射到 FakeHttpContext。映射可以更容易一些 http://blog.ploeh.dk/2010/04/06/MappingTypesWithAutoFixture.aspx,但这会映射 Transient 实例......
无论如何,除非您有令人信服的理由使用手动 Mocks 而不是动态 Mock 库 http://msdn.microsoft.com/en-us/magazine/cc163358.aspx,您不妨决定使用AutoFixture 作为自动模拟容器 http://blog.ploeh.dk/2010/08/19/AutoFixtureAsAnAutomockingContainer.aspx。这可能会让你摆脱很多这种类型的映射。
所以,鉴于这一切,我会guess您也许可以将测试简化为如下所示:
[Fact]
public void SampleTableHtmlHelper_WhenKeyExistWithinHttpContext_ReturnsExpectedHtml()
{
var fixture = new Fixture().Customize(new AutoMoqCustomization());
//Arrange
var vc = fixture.Freeze<ViewContext>();
vc.HttpContext.Items.Add(Keys.SomeKey, "foo");
var htmlHelper = fixture.CreateAnonymous<HtmlHelper>();
var sampleModel = fixture.CreateAnonymous<SampleModel>();
//Act
var result = SampleHelpers.SampleTable(htmlHelper, sampleModel, null).ToString();
//Assert
Assert.Equal("<table id=\"foo\"></table>", result);
}
但是,大部分 Arrange 部分现在是纯粹声明性的,并且由于您似乎已经在使用 xUnit.net,因此您可以使用AutoFixture 的 AutoData 理论 http://blog.ploeh.dk/2010/10/08/AutoDataTheoriesWithAutoFixture.aspx将大部分变量移至方法参数:
[Theory, AutoMoqData]
public void SampleTableHtmlHelper_WhenKeyExistWithinHttpContext_ReturnsExpectedHtml(
[Frozen]ViewContext vc,
HtmlHelper htmlHelper,
SampleModel sampleModel)
{
//Arrange
vc.HttpContext.Items.Add(Keys.SomeKey, "foo");
//Act
var result = SampleHelpers.SampleTable(htmlHelper, sampleModel, null).ToString();
//Assert
Assert.Equal("<table id=\"foo\"></table>", result);
}
假设您已将 AutoMoqCustomization 与 AutoDataAttribute 桥接起来,如下所示:
public class AutoMoqDataAttribute : AutoDataAttribute
{
public AutoMoqDataAttribute :
base(new Fixture().Customize(new AutoMoqCustomization()))
{ }
}
请记住,您可能需要稍微调整上面的代码以使其适合您的 API 的详细信息。这只是一个草图。