gpt4 book ai didi

c# - 如何将 AutoFixture 自定义应用于从基类继承的任何内容?

转载 作者:太空狗 更新时间:2023-10-29 20:21:04 27 4
gpt4 key购买 nike

为了干掉我的单元测试,我尝试使用 AutoFixture 作为 IoC 容器来实例化我的被测系统 (SUT),在这种特殊情况下是 ASP.NET MVC Controller s。因此,我想自定义 AutoFixture 以创建没有自动属性的 Controller 。

我尝试为 ControllerBase 添加定制,但它似乎不适用于 ControllerBase 的子类。

fixture.Customize<ControllerBase>(c => c.OmitAutoProperties());

这是我希望能够编写的测试示例:

    [Theory, AutoFixtureData]
public void ControllerTest(AccountController controller) {
Assert.Equal(default(UrlHelper), controller.Url);
}

当然,如果我为我的项目中的每个特定 Controller 手动添加一个定制,它会起作用,但谁愿意这样做呢?有没有更好的办法?

最佳答案

下面的定制通过了上面的测试,并且做了你想问的事情

public class MvcCostumization : ICustomization
{
public void Customize(IFixture fixture)
{
fixture.Customizations.Add(
new FilteringSpecimenBuilder(
new MethodInvoker(new ModestConstructorQuery()),
new ControllerSpecification()));
}

private class ControllerSpecification : IRequestSpecification
{
public bool IsSatisfiedBy(object request)
{
var t = request as Type;
if (t == null)
return false;

return typeof(ControllerBase).IsAssignableFrom(t);
}
}
}

但是,这会禁用所有 MVC Controller 的所有 属性,包括UserHttpContextModelStateRequestResponse 等。您可能需要在单元测试中使用它们,所以您确定要这样做吗?

我将是第一个同意 MVC Controller 基类严重违反 SRP 的人,但它是给我们的类,所以除了尝试之外我们无能为力充分利用它。

通常情况下,你只需要稍微扭转一下,就可以让AutoFixture自动填充大部分属性。

在 MVC 3 项目中,这个与 AutoMoq extension 结合, 足以创建 Controller 实例:

fixture.Customize<ModelBindingContext>(c => c
.Without(x => x.Model)
.Without(x => x.ModelType));
fixture.Inject(CultureInfo.CurrentCulture);

关于c# - 如何将 AutoFixture 自定义应用于从基类继承的任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13869968/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com