【发布时间】:2009-05-28 01:23:25
【问题描述】:
我有一个带有以下签名的扩展方法(在 BuildServerExtensions 类中)::
public static IEnumerable<BuildAgent> GetEnabledBuildAgents(
this IBuildServer buildServer,
string teamProjectName)
{
// omitted agrument validation and irrelevant code
var buildAgentSpec = buildServer.CreateBuildAgentSpec(teamProjectName);
}
还有另一个调用第一个方法(在 BuildAgentSelector 类中):
public BuildAgent Select(IBuildServer buildServer, string teamProjectName)
{
// omitted argument validation
IEnumerable<BuildAgent> serverBuildAgents =
buildServer.GetEnabledBuildAgents(teamProjectName);
// omitted - test doesn't get this far
}
我正在尝试使用 MSTest 和 Rhino.Mocks (v3.4) 对其进行测试:
[TestMethod]
public void SelectReturnsNullOnNullBuildAgents()
{
Mocks = new MockRepository();
IBuildServer buildServer = Mocks.CreateMock<IBuildServer>();
BuildAgentSelector buildAgentSelector = new BuildAgentSelector();
using (Mocks.Record())
{
Expect.Call(buildServer.GetEnabledBuildAgents(TeamProjectName)).Return(null);
}
using (Mocks.Playback())
{
BuildAgent buildAgent = buildAgentSelector.Select(buildServer, TeamProjectName);
Assert.IsNull(buildAgent);
}
}
当我运行这个测试时,我得到:
System.InvalidOperationException:之前的方法
IBuildServer.CreateBuildAgentSpec("TeamProjectName");需要返回值或抛出异常。
这显然是调用真正的扩展方法而不是测试实现。我的下一个倾向是尝试:
Expect.Call(BuildServerExtensions.GetEnabledBuildAgents(buildServer, TeamProjectName))
.Return(null);
然后我注意到我对 Rhino.Mocks 拦截它的期望可能是错误的。
问题是:如何消除这种依赖并使 Select 方法可测试?
请注意,扩展方法和 BuildAgentSelector 类在同一个程序集中,我宁愿避免更改它或不得不转向扩展方法之外的其他东西,尽管如果我知道另一个模拟框架会处理这个问题,我会考虑它情况。
【问题讨论】:
标签: unit-testing c#-3.0 tdd extension-methods rhino-mocks