我正在使用 AutoFixture 尝试为 WebApi 站点测试我的控制器。如Ploeh 的博客所述,我正在使用带有 Moq 的 AutoData 功能。
我的控制器在构造函数中采用了 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 value)处的值
首先,这仍然是编写这些测试的有效且推荐的方式吗?我喜欢它使一切变得多么小。
其次,我应该怎么做才能解决这个问题?如果我将测试更改为:
[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
}
它通过了,但是我失去了自动构建控制器的能力,如果我向构造函数添加参数仍然可以。