首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >新来的AutoFixture试着把我的头挪开,我看不出它在帮我

新来的AutoFixture试着把我的头挪开,我看不出它在帮我
EN

Stack Overflow用户
提问于 2013-05-08 22:11:02
回答 2查看 901关注 0票数 1

目前,我正在使用定制的假对象,在幕后使用NSubstitute来创建实际的对象,但是随着项目的发展,维护变得非常困难,所以我正在努力寻找替代方法,我希望AutoFixture是适合这项工作的工具。

我读过这些文档,因为文档很少,甚至没有文档,我阅读了Mark的大部分博客文章,包括CheatSheet。

我很难理解的一件事是如何创建一个带有参数的构造函数的对象,在我的例子中,我需要将参数传递给CsEmbeddedRazorViewEngine,也需要将HttpRequestBase传递给ControllerContext。

在我看来,我需要创建一个假对象,并最终创建一个自定义对象,将它们注入到

我还研究了NBuilder,在那里传递参数似乎有点琐碎,但是我已经听说了关于AutoFixture的一些好东西,我想尝试一下。:)

我正在努力减少我拥有的假对象的数量,所以这里是一个真正的测试,我如何使用AutoFixture做同样的事情呢?

代码语言:javascript
运行
AI代码解释
复制
[Theory, 
 InlineData("en-US"), 
 InlineData("en-us"), 
 InlineData("en")]
public void Should_return_the_default_path_of_the_view_for_enUS(string language)
{
    // Arrange
    const string EXPECTED_VIEW_PATH = "~/MyAssemblyName/Views/Home/Index.cshtml";

    CsEmbeddedRazorViewEngine engine = CsEmbeddedRazorViewEngineFactory.Create(ASSEMBLY_NAME, VIEW_PATH, string.Empty);

    string[] userLanguage = { language };

    HttpRequestBase request = FakeHttpRequestFactory.Create(userLanguage);

    ControllerContext controllerContext = FakeControllerContextFactory.Create(request);

    // Act
    ViewEngineResult result = engine.FindPartialView(controllerContext, VIEW_NAME, false);

    // Assert
    RazorView razorView = (RazorView)result.View;

    string actualViewPath = razorView.ViewPath;

    actualViewPath.Should().Be(EXPECTED_VIEW_PATH);
}

我使用xUnit作为我的测试框架,NSubstitute作为我的模拟框架,我应该同时安装AutoFixture.Xunit和AutoFixture.AutoNSubstitute吗?

更新:在了解了越来越多的之后,我想它不是适合这项工作的工具,因为我试图用AutoFixture取代我的测试双倍工厂,而不是用它来设置SUT。

由于奇怪的原因,我认为它在做NBuilder正在做的同样的事情,从我看来,它们是非常不同的工具。

因此,经过一些思考,我想我会去改变我在测试中的方法,把工厂变成对象,然后使用AutoFixture创建我的SUT,并将我的测试加倍地注入到它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-09 00:48:48

注意事项:我没有CsEmbeddedRazorViewEngine类型和所有其他自定义类型的源代码。

下面是如何用编写

代码语言:javascript
运行
AI代码解释
复制
[Theory]
[InlineAutoWebData("en-US", "about", "~/MyAssemblyName/Views/Home/Index.cshtml")]
[InlineAutoWebData("en-US", "other", "~/MyAssemblyName/Views/Home/Index.cshtml")]
public void Should_return_the_default_path_of_the_view_for_enUS(
    string language, 
    string viewName,
    string expected,
    ControllerContext controllerContext,
    CsEmbeddedRazorViewEngine sut)
{
    var result = sut.FindPartialView(controllerContext, viewName, false);
    var actual = ((RazorView)result.View).ViewPath;

    actual.Should().Be(expected);
}

是如何工作的

它将AutoFixture本身与用于xUnit.net和NSubstitute的胶水库一起使用:

代码语言:javascript
运行
AI代码解释
复制
PM> Install-Package AutoFixture.Xunit
PM> Install-Package AutoFixture.AutoNSubstitute

使用InlineAutoWebData,您实际上通过AutoFixture组合了内联值和自动生成的数据值--还包括使用NSubstitute进行自动模拟。

代码语言:javascript
运行
AI代码解释
复制
internal class InlineAutoWebDataAttribute : CompositeDataAttribute
{
    internal InlineAutoWebDataAttribute(params object[] values)
        : base(
            new InlineDataAttribute(values),
            new CompositeDataAttribute(
                new AutoDataAttribute(
                    new Fixture().Customize(
                        new WebModelCustomization()))))
    {
    }
}

备注

实际上,您可以将上面的WebModelCustomization自定义替换为AutoNSubstituteCustomization,并且它可以工作。

但是,假设您使用的是ASP.NET MVC 4,则需要使用以下方法定制Fixture实例:

代码语言:javascript
运行
AI代码解释
复制
internal class WebModelCustomization : CompositeCustomization
{
    internal WebModelCustomization()
        : base(
            new MvcCustomization(),
            new AutoNSubstituteCustomization())
    {
    }

    private class MvcCustomization : ICustomization
    {
        public void Customize(IFixture fixture)
        {
            fixture.Customize<ControllerContext>(c => c
                .Without(x => x.DisplayMode));

            // Customize the CsEmbeddedRazorViewEngine type here.
        }
    }
}

再读

票数 5
EN

Stack Overflow用户

发布于 2013-05-09 04:22:38

最后我就这么做了。

代码语言:javascript
运行
AI代码解释
复制
[Theory,
 InlineData("en-US", "Index", "~/MyAssemblyName/Views/Home/Index.cshtml"),
 InlineData("en-us", "Index", "~/MyAssemblyName/Views/Home/Index.cshtml"),
 InlineData("en", "Index", "~/MyAssemblyName/Views/Home/Index.cshtml")]
public void Should_return_the_default_path_of_the_view(string language, string viewName, string expected)
{
    // Arrange
    CsEmbeddedRazorViewEngine engine = new CsEmbeddedRazorViewEngineFixture();

    ControllerContext controllerContext = FakeControllerContextBuilder.WithLanguage(language).Build();

    // Act
    ViewEngineResult result = engine.FindPartialView(controllerContext, viewName, false);

    // Assert
    string actualViewPath = ((RazorView)result.View).ViewPath;

    actualViewPath.Should().Be(expected);
}

我封装了设置我的SUT到一个夹具的细节,并使用构建器模式来处理我的假货,我认为它现在是可读的和相当简单的。

虽然AutoFixture看起来很酷,但学习曲线似乎很长,我需要投入足够的时间来理解它,目前,我想清理我的单元测试,使它们更加可读性。:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16455511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文