Unit testing Autofixture和WebApi控制器

Unit testing Autofixture和WebApi控制器,unit-testing,asp.net-web-api,moq,xunit,autofixture,Unit Testing,Asp.net Web Api,Moq,Xunit,Autofixture,我正在使用AutoFixture尝试测试WebApi站点的控制器。我正在使用自动数据功能和Moq,如上所述 我的控制器在构造函数中使用IDepartmentManager。这是我的测试: [Theory, AutoMoqData] public void GetCallsManagerCorrectly( [Frozen]Mock<IDepartmentManager> departmentManagerMock, DepartmentsController sut)

我正在使用AutoFixture尝试测试WebApi站点的控制器。我正在使用自动数据功能和Moq,如上所述

我的控制器在构造函数中使用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
}
[理论,自动烟雾数据]
public void GetCallsManager是否正确(
[冻结]模拟部门经理检查,
部门控制员(sut)
{
//夹具设置
//运动系统
sut.Get();
//核实结果
departmentManagerMock.Verify(d=>d.GetAllDepartments(),Times.justice(1));
//拆卸
}
当我运行此测试时,它失败,原因如下:

GetCallsManager已正确失败:
System.InvalidOperationException:运行时引发异常 为理论获取数据 Provision.Tests.WebApiControllerTests.DepartmentControllerTests.GetCallsManager正确: 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
}
[理论,自动烟雾数据]
public void GetCallsManager是否正确(
[冻结]模拟部门经理(检查)
{
//夹具设置
部门控制员sut=
新的部门控制器(departmentManagerMock.Object);
//运动系统
sut.Get();
//核实结果
departmentManagerMock.Verify(d=>d.GetAllDepartments(),Times.justice(1));
//拆卸
}

它通过了,但是我失去了自动构建控制器的能力,如果我向构造函数添加参数,仍然可以正常工作。

这绝对是使用AutoFixture编写测试的推荐方法。这个问题很容易解决

我建议创建一个稍有不同的属性和定制,而不是像博客文章中所描述的那样实现[AutoMoqData]属性——一个基本上可以作为整个单元测试项目的一组约定的集合。我总是这样做,并且我总是竭尽全力为一个单元测试项目只提供一组约定。一组约定可以帮助我保持测试(和测试)的一致性

public class AutoMyWebApiDataAttribute : AutoDataAttribute
{
    public AutoMyWebApiDataAttribute()
        : base(new Fixture().Customize(new MyWebApiCustomization()))
    {
    }
}
MyWebApicCustomization的定义如下:

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类——这应该可以做到这一点


请注意。

@BrianMcCord和其他人非常确定上面的
HttpSchemeCustomization
现在是afv3+中固有的。