我使用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
}
它通过,但后来我失去了有自动建立的控制器,并且仍然是确定的,如果我添加参数构造函数的能力。