【发布时间】:2012-09-18 07:54:51
【问题描述】:
我正在使用 AutoFixture 尝试为 WebApi 站点测试我的控制器。如Ploeh's blog 所述,我正在使用带有 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.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
}
它通过了,但是我失去了自动构建控制器的能力,如果我向构造函数添加参数仍然可以。
【问题讨论】:
标签: unit-testing asp.net-web-api moq xunit autofixture