У меня есть метод расширения со следующей подписью (в классе 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 находятся в одной сборке, и я предпочел бы избегать изменения этого параметра или необходимости обращаться к чему-либо, кроме метода расширения, хотя я бы подумал о другой моделирующей среде, если бы знал, что она справится с этим ситуация.