Unit testing Autofixture和WebApi控制器
我正在使用AutoFixture尝试测试WebApi站点的控制器。我正在使用自动数据功能和Moq,如上所述 我的控制器在构造函数中使用IDepartmentManager。这是我的测试: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)
[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+中固有的。