Требуется модульное тестирование сервиса с системными библиотеками - PullRequest
2 голосов
/ 20 апреля 2009

В настоящее время я пишу "PluginsService". Мне нужно использовать системные библиотеки Assembly, AssemblyName, Directory и File. В настоящее время я создаю интерфейсы-обертки для каждого из них, чтобы можно было их высмеивать в тестах. Это, однако, означает, что мне приходится вводить в сервис довольно много оболочек.

Так, например, при тестировании метода, который ищет в папке некоторые плагины, я делаю это

With.Mocks(mockery)
    .Expecting(() =>
    {
            Expect.Call(directory.GetFiles(PLUGINPATH, PLUGINSEARCHPATTERN)).IgnoreArguments().Return(pluginLibraries);
            Expect.Call(file.ReadAllBytes(null)).IgnoreArguments().Return(bytes);
               Expect.Call(assemblyName.GetAssemblyName("fileName")).IgnoreArguments().Return(name);
            Expect.Call(assembly.GetExecutingAssembly()).Return(executingAssembly);
    })
    .Verify(() => result = service.FindAvailablePlugins());

У меня есть 2 вопроса:

  1. Есть ли лучший способ обработки элементов системной библиотеки для TDD?
  2. Разве 4 предмета слишком много для инъекции в один класс?

Ответы [ 2 ]

1 голос
/ 21 апреля 2009

Недавно я сделал то же самое и придумал дизайн, в котором у меня был свой собственный объект Directory, в котором был DirectoryBoundary, который был ссылкой на каталог. Сам по себе DirectoryBoundary не тестировался напрямую, но я использовал некоторые интеграционные тесты, чтобы охватить его.

Если вы пойдете в этом направлении, я думаю, вы обнаружите, что ваш дизайн становится намного более свободным, а ваши точки интеграции легче. Посмотрим правде в глаза, классы ввода-вывода .NET File не были предназначены для тестируемости. Так что придумайте свое. Вы можете издеваться над новыми Directory классами, или делать то, что я делал, и иметь только поддельные классы Boundary и какую-то форму создателя, в которую вы вводите.

Надеюсь, это поможет.

0 голосов
/ 21 апреля 2009

Орен использовал что-то подобное, чтобы иметь дело с DateTime в тестах:

public static class SystemTime
{
  public static Func<DateTime> Now = () => DateTime.Now;
}

и затем в тестах:

SystemTime.Now = () => new DateTime(2000,1,1);
repository.ResetFailures(failedMsgs); 
SystemTime.Now = () => new DateTime(2000,1,2);
var msgs = repository.GetAllReadyMessages(); 
Assert.AreEqual(2, msgs.Length);

Это альтернатива инъекции, но не безопасна для нитей. Работа со временем в тестах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...