Autofixture和的WebAPI控制器(Autofixture and WebApi Cont

2019-09-23 01:46发布

我使用AutoFixture尝试测试我控制器的网站的WebAPI。 我使用的研究机构Autodata功能,以起订量为上指出Ploeh的博客 。

我的控制器需要在构造函数中的IDepartmentManager。 下面是我的测试:

[Theory, AutoMoqData]
public void GetCallsManagerCorrectly(
    [Frozen]Mock<IDepartmentManager> departmentManagerMock,
    DepartmentsController sut)
{
    // Fixture setup
    // Exercise system
    sut.Get();
    // Verify outcome
    departmentManagerMock.Verify(d => d.GetAllDepartments(), Times.Exactly(1));
    // Teardown
}

当我运行这个测试失败,出现以下:

GetCallsManagerCorrectly失败:
System.InvalidOperationException:在获取理论数据Provision.Tests.WebApiControllerTests.DepartmentControllerTests.GetCallsManagerCorrectly引发异常:System.Reflection.TargetInvocationException:异常已通过调用的目标引发异常。 ---> System.ArgumentException:只有 'HTTP' 和 'HTTPS' 方案是允许的。 参数名:在System.Net.Http.HttpRequestMessage.set_RequestUri值(URI值)

首先,是这仍然写这些测试的有效和推荐的方式? 我喜欢它有多小,使一切。

其次,我应该怎么做才能解决这个问题? 如果我改变我的测试,以这样的:

[Theory, AutoMoqData]
public void GetCallsManagerCorrectly(
    [Frozen]Mock<IDepartmentManager> departmentManagerMock)
{
    // Fixture setup
    DepartmentsController sut =
        new DepartmentsController(departmentManagerMock.Object);
    // Exercise system
    sut.Get();
    // Verify outcome
    departmentManagerMock.Verify(d => d.GetAllDepartments(), Times.Exactly(1));
    // Teardown
}

它通过,但后来我失去了有自动建立的控制器,并且仍然是确定的,如果我添加参数构造函数的能力。

Answer 1:

这绝对是写与AutoFixture测试的推荐方式。 这个问题是很容易解决。

相反,实施如在博客文章中描述的[AutoMoqData]属性的,我建议建立一个稍微不同的属性和自定义 - 一组基本上将作为一个完整的单元测试项目一组约定。 我总是这样做,我总是竭尽全力有只为一个单元测试项目单一的一套约定。 单套约定的帮助我保持我的测试(和SUT S)是一致的。

public class AutoMyWebApiDataAttribute : AutoDataAttribute
{
    public AutoMyWebApiDataAttribute()
        : base(new Fixture().Customize(new MyWebApiCustomization()))
    {
    }
}

该MyWebApiCustomization可以定义是这样的:

public class MyWebApiCustomization : CompositeCustomization
{
    public MyWebApiCustomization()
        : base(
            new HttpSchemeCustomization(),
            new AutoMoqCustomization(),
        )
    {
    }

    private class HttpSchemeCustomization : ICustomization
    {
        public void Customize(IFixture fixture)
        {
            fixture.Inject(new UriScheme("http"));
        }
    }
}

注意附加HttpSchemeCustomization类 - 应该做的伎俩。

请注意, 自定义的顺序是有意义的 。



文章来源: Autofixture and WebApi Controller