Нет способа перехватить статические методы в FakeItEasy (и в настоящее время ни в каком другом бесплатном фреймворке с открытым исходным кодом для .Net). Чтобы иметь возможность имитировать статику (и запечатанные классы), вам придется купить Typemock Isolator или Just Mock у Telerik.
Многие разработчики считают статику запахом кода (в большинстве случаев). Поэтому тот факт, что фреймворки с открытым исходным кодом не поддерживают это, рассматривается как хорошая вещь, поскольку он способствует созданию более совершенных проектов. «Золотое правило» насмешек - «если вы не можете управлять им, не издевайтесь над ним», поэтому наиболее распространенный способ решить проблему, с которой вы столкнулись, - создать оболочку для статических вызовов. Вы проверяете взаимодействие с этой - насмешливой - оберткой. System.DateTime.Now - это пример статики, которую вы часто хотели бы проверить в своих тестах. Чтобы изолировать ваши тесты от этого, вы должны сделать что-то вроде этого:
public interface ISystemTimeProvider
{
DateTime Now { get; }
}
public class DateTimeNowSystemTimeProvider
: ISystemTimeProvider
{
public DateTime Now
{
get
{
return DateTime.Now;
}
}
}
С указанным выше интерфейсом и реализацией ваша SUT будет зависеть от интерфейса (например, через внедрение конструктора). В ваших тестах вы вводите его с подделкой (A.Fake<ISystemTimeProvider>()
). Реализация DateTimeSystemTimeProvider никогда не будет тестироваться модульно, она очень низкого уровня и не требует никаких других тестов, кроме интеграционных тестов.
Я не очень знаком с библиотекой капчи, о которой вы говорите, поэтому я не уверен, как именно вы примените вышеуказанный шаблон в этом случае, но я уверен, что это можно сделать так или иначе.